django专栏 search 07.分组查询

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()

    # 如果分组查询报错,需要修改数据库严格模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值