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 @ 2022-03-02 21:27  JudyJU  阅读(153)  评论(0)    收藏  举报