聚合查询与分组查询
在首先需要知道在数据库中聚合查询与分组查询是怎么查的
聚合: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"
如果想对所有查询对象的关联对象进行聚合:
例:统计每一个出版社的最便宜的书
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查询:
修改表记录
删除表记录
持续更新.....