import os
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'idjango.settings')
import django
from django.db.models import Count, Min, Sum
django.setup()
from idea import models
# 分组之后只能获取到分组的依据,组内其他字段无法直接获取了
# annotate()关键字分组
# 1.统计每一本书的作者个数
# models.* 按照*来分组 --> models.Book.objects.annotate()
# authors__pk/id 可以简写为 author
print(models.Book.objects.annotate(authors_num=Count('authors__id')).values('title', 'authors_num'))
# <QuerySet [{'title': '望庐山瀑布', 'authors_num': 1} ... {'title': '绝句', 'authors_num': 1}]>
# 2.统计每个出版社最低的书籍价格
print(models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price'))
# <QuerySet [{'name': 'North', 'min_price': Decimal('24.00')}, {'name': 'South', 'min_price': Decimal('24.00')}]>
# 3.统计不止一个作者的书籍名称
print(models.Book.objects.annotate(authors_num=Count('authors')).filter(authors_num__gt=1).values('title', 'authors_num'))
# <QuerySet []>
# 只要ORM语句得出的结果为<QuerySet>对象,就可以向下点其方法[.filter() .value ...]
# 4.查询每个作者出版书籍的总价格
print(models.Author.objects.annotate(sum_price=Sum('book__price')).values('name', 'sum_price'))
# <QuerySet [{'name': '李白', 'sum_price': Decimal('60.00')} ... {'name': '苏轼', 'sum_price': Decimal('28.00')}]>
# 按照指定的字段分组
models.Book.objects.values('price').annotate()
# 如果分组查询报错,需要修改数据库严格模式
django专栏 search 07.分组查询
最新推荐文章于 2024-05-05 05:54:54 发布