Django-ORM模型层语法(十)多表查询之分组查询

分组查询

生成多表的准备工作已经在博客[Django-ORM模型层语法(四)之多表操作准备工作]中写了,各位可以点击下方的链接,跟着操作:

多表操作的准备工作(非常重要!一定要看喔!)

app01_author表 :

idnameageauthor_detail_id
1Kevin181
2Steven202
3Adam283

app01_book表 :

idtitlepricepublish_datepublishs_id
1红楼梦662020-02-022
2聊斋1002020-02-021
3论语2002020-02-022
4三国演义3002020-02-021
5老子4002020-02-022

app01_authordetail表 :
| id |phone|addr|
|–|–|–|–|
| 1 |100| 南京|
| 2 |200| 北京|
| 3 |300| 深圳|

app01_pulish表 :

idnameaddremail
1东方出版社东方123@qq.com
2西方出版社西方666@qq.com

app01_book_authors表 :
| id |book_id|author_id|
|–|–|–|–|
| 1 |1| 1|
| 2 |1| 2|
| 3 |2| 1|
| 4 |2| 3|
| 5|3| 1|
| 6|3| 2|
| 7|3| 3|
app01/tests.py

"""
当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
而是直接写一个测试脚本即可
脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
"""
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行
import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
    import django
    django.setup()
    # 在这个代码块的下面就可以测试django里面的单个py文件了
    # 所有的代码都必须等待环境准备完毕之后书写
    from app01 import models

    # 分组查询 annotate
    '''
    MySQL分组查询都有哪些特点
        分组之后默认只能获取到分组的依据,组内其他字段都无法直接获取了
            严格模式:ONLY_FULL_GROUP_BY 
    '''
    from django.db.models import Max, Min, Sum, Count, Avg
    # 1.统计每一本书的作者个数
    res = models.Book.objects.annotate() # models后面点什么,就按什么分组
    res = models.Book.objects.annotate(author_num=Count('authors')).values('title','author_num')
    '''
    author_num是我们自己的定义的字段,用来存储统计出来的每本书对应的作者个数
    '''
    res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
    print(res)

    # 2.统计每个出版社卖的最便宜的书的价格
    res = models.Pulish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
    print(res)

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

    # 4.查询每个作者出的书的总价格
    res = models.Author.objects.annotate(total_price=Sum('book__price')).values('name','total_price')
    print(res)
    '''
    如果机器上出现分组查询报错的情况,需要修改数据库严格模式.
    '''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值