聚合查询方法名aggregate(),返回的是一个字典,不是queryset
聚合方法需要搭配具体计算的方法一起使用,需要导入avg max min count
计算书本的平均价格,返回值的key值为 `字段__avg`,
book = models.Book.objects.all().aggregate(Avg("price")) #{'price__avg': Decimal('31.593333')}
也可以自定义key值
book2 = models.Book.objects.all().aggregate(avg_price =Avg("price")) #{'avg_price': Decimal('31.593333')}
分组查询
ORM中,book.Object.all() 等于sql语句的select * from book
,而book.Object.all().values("publish")等于sql语句的select publish from book
,
ORM中的values有2种意思,一个是只提取publish字段显示,如果Book.objects.values("publish_id").annotate 后面跟了聚合函数,也会按照该字段进行分组.
所以Book.objects.all().annotate 是一句没有意义的聚合命令,因为all()里面包含了id,每条记录都是不同的,因此无法产生按照特定字段进行聚合.
比如emp表,需要统计各个部门的人数
emp:
id name age dep
1 alex 18 销售部
2 blex 38 销售部
3 clex 28 市场部
4 dlex 48 客服部
sql语句
select Count(id) from emp group by dep; 通过对dep字段分组,再对每组的id个数进行统计
单表中的分组查询
orm中分组是用annotate(),返回值是一个query set
使用语法是前面先用value("dep").annotate(Avg("age"))
value("dep") 等于明确按dep分组,语法等同于group by dep
例子:
avg_age = models.Book.objects.values("publish_id").annotate(zidingyi =Avg("price")) #key值和aggregate一样可以自定义
# QuerySet[{'publish_id': 1, 'zidingyi': Decimal('38.275000')}, {'publish_id': 2, 'zidingyi': Decimal('18.230000')}]