Django(9) 分组管理查询

分组管理查询

🌹分组管理查询标准🌹
在annotate()内写聚合函数
values在annotate()前,表示group by
values在annotate()后,表示取字段
filter在annotate()前,表示where条件
filter在annotate()后,表示having

例题: 
1、查询出版社id大于1的出版社id以及书的平均价格
res=models.Bookz.objects.filter(publish_id__gt=1).values('publish_id').annotate(price_avg=Avg('price')).values('publish_id','price_avg')
print(res)

2、查询出版社id大于1的出版社并且出书平均价格大于30的
res=models.Bookz.objects.filter(publish_id__gt=1).values('publish_id').annotate(price_avg=Avg('price')).filter('price_avg__gt=30').values('price_id','price_avg')
print(res)

3、查询每个出版社书版的书籍的个数以及书版社的名字-->要注意的是联表的话最好用group by的表作为基表
res=models.Publishz.objects.vlaues('id').annotate(book_count=Count('bookz__id')).values('title','book_count')  

🌼 第三题的简写版本。如果基表是group by的表的话可以不写分组的那个values,同样book_id也可以直接写成book,所以简写版本:
res=models.Publishz.objects.annotate(book_count=Count('bookz')).values('title','book_count')

4、查询出每个出版社的书籍的个数以及出版社的名字,以书为基表
res=models.Bookz.objects.values('publish__id').annotate(book_count=Count('id')).values('book_count','publish__title')

5、查询每一个作者的名字以及出版过的书籍的最高价格
res=models.Authorz.objects.values('id').annotate(price_max=Sum(bookz__price)).values('name','price_max')

6、查询每一个书籍的名称以及对应的作者个数
res=models.Bookz.objects.values('id').annotate(author_count=Count(Authors__id)).values('title','author_count')
posted @   JudyJU  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示