Django中ORM聚合查询aggregate和分组查询annotate

Django中ORM聚合查询aggregate和分组查询annotate

聚合查询-aggregate

聚合查询是使用aggregate()过滤器调用聚合函数.

聚合函数从django.db.models引入

聚合函数包括: Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和

from django.db.models import Avg,Max,Min,Count,Sum

聚合查询返回的数据类型为字典类型

字典的格式为:

  • 键的名称默认是属性名__聚合函数名小写,值就是计算出来的聚合值
  • 如果需要自定义返回字典的键的名称,可以起别名
  • aggregate(别名 = 聚合函数名"属性名"))

aggregate()是查询集QuerySet的一个终止子句,意思就是使用aggregate()之后的结果就不是查询集了,就不能使用查询集的方法了

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

from django.db.models import Avg

...假装模型类都存在,我只写查询语句

res = Book.objects.aggregate(Avg("price"))
# Book为Django中模型类, price为模型类中的字段名
# 在使用aggregate()查询时all()可以省略
print(res)

******打印结果大致为
>>>{
    
    'price__avg':聚合值}

分组查询-annotate

分组查询一般也会用到聚合函数

from django.db.models import Avg,Max,Min,Count,Sum

分组查询后的返回值与聚合查询后的返回值不同

    1. 分组后用values取值,则返回值是QuerySet数据类型里面为一个一个的字典
    2. 分组后用values_list取值,则返回值是QuerySet数据类型里面为一个一个的元祖

annotate 里面放的是聚合函数

values或者values_list 放在annotate前面: 表示values或values_list是声明以什么字段分组,annotate执行分组

values或者values_list放在annotate后面: annotate表示直接以当前表的pk执行分组, values或者values_list表示查询那些字段, 并且要将annotate里的聚合函数起别名, 在values或者values_list里面写其别名

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

res = Publish.objects.values("name").annotate(in_price = Min("book__price"))

# 先以出版社的名字进行分组, 然后再使用聚合函数查询到每个出版社里面最便宜的书籍

例2: 查询出各个作者出的书的总价格

res = Author.objects.annotate(all = Sum("book_price")).values("name", "all")

猜你喜欢

转载自blog.csdn.net/lxb_wyf/article/details/109745336