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")
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值