Django | ORM分组查询

ORM分组查询

# 关键字:annotate()
# models后面(.)什么就是按什么分组
eg:models.Book.objects.annotate()   # 这里就是按照书籍表每本书来分组

示例:

# 统计每本书的作者数量
    res = models.Book.objects.annotate(author_num=Count('authors__id')).values('name','author_num')
    print(res)   # 按照书籍表分组,统计外键字段对应作者表的id
    
 # 简写
    res1 = models.Book.objects.annotate(author_num=Count('authors')).values('name','author_num')
    print(res1)
    
 # author_num为我们自己定义的字段,用来存储统计出来的每本书对应的作者个数

# 统计每个出版社卖的最便宜的书的价格
    res = models.Publish.objects.annotate(book_price=Min('book__price')).values('name','book__name','book_price')
    print(res)
    
# 解析:先按出版社分组,然后再统计最便宜书的价格就是用到Min聚合查询,反向查询用表名的小写book,然后要用到书表的价格字段book__price,再通过values方法查找的对应的数据

# 统计不止一个作者的图书
    res = models.Book.objects.annotate(more_author=Count('authors')).filter(more_author__gt=1).values('name','more_author')
    print(res)
    
    
# 补充:只要orm语句得出的结果是一个queryset对象,那么它就可以继续无限制的点queryset对象封装的方法。

# 查询每个作者出的书的总价格
    res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
    print(res)

补充:

如果想按照指定的字段分组该如何处理呢?
# 找到指定的字段后在进行分组
例:models.Book.objects.values('price').annotate()

注:如果在分组查询报错的情况,需要修改数据库的严格模式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值