聚合查询方法名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')}]


跨表之组合查询

sql语句示例

Django ORM聚合查询,分组查询_字段

​select my_book_book.title,count(my_book_publish.pid) from my_book_book inner join my_book_publish on my_book_book.publish_id = my_book_publish.pid group by my_book_publish.pid​

Django ORM聚合查询,分组查询_sql语句_02