django基础之ORM之聚合函数及其他操作

聚合查询与分组查询

在首先需要知道在数据库中聚合查询与分组查询是怎么查的

聚合:aggregate(*args,**kwargs)

例如:计算所有图书的平均价格:

#计算所有书籍的平均价格
from django.db.models import Avg
models.Book.objects.all().aggregate(Avg('price'))
结果格式如:{'price__avg':34.5}

aggregate()是queryset的终止子句,意思是说,它返回的是一包含一些键值对的字典。键的名称是聚合值得标识符,值是计算出来的聚合值,键的名称是按照字段和聚合函数的名称自动生成的,想要给聚合值指定一个名称,可以向聚合子句提供它。

例:models.Book.objects.all().aggregate_price(Avg('price'))

结果:{'average_price': 34.35}

如希望生成的不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查:

例:from django.db.models import Avg,Max,Min
  models.Book.objects.aggregate(Avg('price'),Max('price'),Min('price'))
结果:{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

分组:annotate()

调用的queryset中的每一个对象都生成一个独立的统计值(统计方法用聚合函数)。

例如:

bookList=models.Book.objects.annotate(authorsNum=Couont('authors'))
for book_obj in bookList:
        print(book_obj.title,book.authorsNum)

以上表达的意思在sql语句中怎样写呢:

SELECT 
"app01_book"."nid", 
"app01_book"."title", 
"app01_book"."publishDate", 
"app01_book"."price", 
"app01_book"."pageNum", 
"app01_book"."publish_id", 
COUNT("app01_book_authors"."author_id") AS "authorsNum" 
FROM "app01_book" LEFT OUTER JOIN "app01_book_authors" 
ON ("app01_book"."nid" = "app01_book_authors"."book_id") 
GROUP BY 
"app01_book"."nid", 
"app01_book"."title", 
"app01_book"."publishDate", 
"app01_book"."price", 
"app01_book"."pageNum", 
"app01_book"."publish_id"
sql分组查询语句

如果想对所有查询对象的关联对象进行聚合:

例:统计每一个出版社的最便宜的书

publishList=models.Publish.objects.annotate(MinPrice=Min('book__price'))
for publish_obj in publishList:
        print(publish_obj.name,publish_obj.MinPrice)

如若不用for循环遍历可以用valuelist:
queryResult= Publish.objects
            .annotate(MinPrice=Min("book__price"))
            .values_list("name","MinPrice")
print(queryResult)  

另外一种方式:

queryResult=models.Book.objects.values("publish__name").annotate(MinPrice=Min('price'))
如果用这种方法,有一个出版社没有出版过书会怎么样呢?

解答:查看Book.objects.values("publish__name")的结果和对应的sql语句可以理解为values内的字段也就是group by的字段

F查询和Q查询

F查询:

Q查询:

修改表记录

删除表记录

持续更新.....

原文地址:https://www.cnblogs.com/kxllong/p/8361918.html