Django之ORM聚合查询、分组查询
ORM聚合查询
聚合查询
五个聚合函数的时候,max min avg count sum,要先导入,一般配合分组一起使用
from django.db.models import Min,Max,Count,Sum,Avg
1.所有书的平均价格
单单想使用聚合函数,但不想分组,mysql不可以,但orm中可以,不过要用到aggregate
res = models.Book.objects.aggregate(Ang("price"))
一次性全拿
res = models.Book.objects.aggregate(Ang("price"),Min(“price”),Max(“price”),Count(“price”),Sum(“price”))
单独使用聚合的很少,都是配合分组一起使用。
ORM分组查询
annotate=mysql中的group by
mysql中默认是严格模式,ONLY_FULL_GROUP_BY
分组之后默认只能获取到分组的依据,
组内的其他字段都无法直接获取了。
到了orm中,分组查询
1.统计每本书的作者个数(按书分组)
# res =models.Book.objects.annotate() models后面点什么,就按什么分组。
res =models.Book.objects.annotate(author_num = Count("authors_ _id")).values("title","author_num")
这里又涉及到跨表,Count中authors跨表,_ _然后表示字段
author_num是自定义字段,用来存储统计出来的每本书对应的作者个数。
authors__id可以不加__id,orm自动按主键统计。
2.统计每个出版社卖的最便宜的书价,反向
res=models.Publish.objects.annotate(min_price=Min("book__price")).values("name","min_price")
3.统计不止一个作者的图书
res=models.Book.obejcts.annotate(author_num=Count("authors")).filter(author_num__gt=1).values("title","author_num")
只要orm语句得出的结果还是一个queryset对象,就可以继续无限的点queryset对象封装的方法
4.查询每个作者出版的书的总价格
res = models.Auhtors.objects.annote(total_price=Sum("book__price")).values("namec ","total_price")
如果想按照指定的字段分组呢?
models.Book.objects.values("price").annotate()
如果分组报错了,那么要修改数据库的严格模式,说明分组后只能拿分组字段,其他字段不能拿。
看十遍不如自己写一遍!巩固基础,纵横开拓!