Django | ORM分组查询
ORM分组查询
# 关键字:annotate()
# models后面(.)什么就是按什么分组
eg:models.Book.objects.annotate() # 这里就是按照书籍表每本书来分组
示例:
# 统计每本书的作者数量
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('name','author_num')
print(res) # 按照书籍表分组,统计外键字段对应作者表的id
# 简写
res1 = models.Book.objects.annotate(author_num=Count('authors')).values('name','author_num')
print(res1)
# author_num为我们自己定义的字段,用来存储统计出来的每本书对应的作者个数
# 统计每个出版社卖的最便宜的书的价格
res = models.Publish.objects.annotate(book_price=Min('book__price')).values('name','book__name','book_price')
print(res)
# 解析:先按出版社分组,然后再统计最便宜书的价格就是用到Min聚合查询,反向查询用表名的小写book,然后要用到书表的价格字段book__price,再通过values方法查找的对应的数据
# 统计不止一个作者的图书
res = models.Book.objects.annotate(more_author=Count('authors')).filter(more_author__gt=1).values('name','more_author')
print(res)
# 补充:只要orm语句得出的结果是一个queryset对象,那么它就可以继续无限制的点queryset对象封装的方法。
# 查询每个作者出的书的总价格
res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
print(res)
补充:
如果想按照指定的字段分组该如何处理呢?
# 找到指定的字段后在进行分组
例:models.Book.objects.values('price').annotate()
注:如果在分组查询报错的情况,需要修改数据库的严格模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)