Django分组查询
先补充两个知识点:
1.group by
大前提:可以按照任意字段分组,但是最好是按照分辨度比较低的来分组(重复比较多的分辨度比较低)。
group by分组可以单独使用,不搭配其他条件。
分组的字段重复的会被隐去,如果想查看可以用固定的函数去查看。
分组主要是为了查看分组后该字段每个组的个数
select post,count(*) from emp where id>3 group by post having count(id) >5
2.having
having是将通过where查询出的记录再次进行过滤,可以使用聚合函数。
下面可以进入Django分组查询正题:
annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值(统计方法用聚合函数)。
总结 :跨表分组查询本质就是将关联表join成一张表,再按单表的思路进行分组查询。
把分组出来的每一个对象都进行聚合!!!
# 分组
# 统计每一本书作者个数
from django.db.models import Count,Min,Max
# ret=Book.objects.all().annotate(author_num=Count('authors__nid')).values('name','author_num')
# values 在这里代指group by 的字段
# ret=Book.objects.all().values('name').annotate(author_num=Count('authors__name')).values('name','author_num')
# print(ret)
# for book in ret:
# print(book.name,":",book.c)
# print(ret)
# 统计每一个出版社的最便宜的书
# ret=Publish.objects.all().annotate(c=Min('book__price')).values('name','c')
# for pub in ret:
# print(pub.name,":",pub.c)
# print(ret)
# 统计每一本以py开头的书籍的作者个数:
# ret=Book.objects.all().filter(name__startswith='红').annotate(c=Count('authors__nid')).values('name','c')
# print(ret)
#统计不止一个作者的图书:(作者数量大于一)
# 注意:valu再annotate前,代表group by 的字段,不写value,默认以基表的主键做group by 在后代表我要select出来的字段
# filter在前,代指where的东西,在后,代表having 的东西
# ret = Book.objects.all().values('name').annotate(author_num=Count('authors__name')).filter(author_num__gt=1).values('name','author_num')
# print(ret)
# 练习:查询各个作者出的书的总价格:
# ret=Author.objects.all().annotate(c=Sum('book__price')).values('name','c')
# print(ret)
# 查询每个出版社的名称和书籍个数
# ret=Publish.objects.all().annotate(c=Count('book__nid')).values('name','c')
# ret=Publish.objects.all().annotate(c=Count('book')).values('name','c')
# print(ret)
Django分组查询的更多相关文章
- Django聚合分组查询、常用字段
首先回顾sql中聚合和分组的概念: 如果没有分组,会把整张表作为一个大组,查询字段必须是聚合结果:如果有分组,分组之后,必须要使用聚合的结果作为having的条件. 聚合查询 聚合:aggregate ...
- Django聚合与分组查询中value与annotate的顺序问题
在学习Django聚合与分组查询中,发现value与annotate的顺序不同时,查询结果大相径庭,经过一下午的研究,终于弄明白了,现在分享给大家,先上结论: 结论 value在annotate前面时 ...
- $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数
一.聚合函数 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #导入 # .查询图书的总价,平均价,最大价,最小价 ...
- day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁
一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- django 一个关于分组查询的问题分析
ret=Emp.objects.values('dep').annotate(avg_salary=Avg('salary')) print(ret) # ---*******单表分组查询ORM总结: ...
- Django的mode的分组查询和聚合查询和F查询和Q查询
1.聚合查询 # 聚合函数aggregate,求指定字段的最大值,最小值,平均值,和的值,方法如下 from django.db.models import Avg from django.db.mo ...
- Django进阶Model篇007 - 聚集查询和分组查询
接着前面的例子,举例聚集查询和分组查询例子如下: 1.查询人民邮电出版社出了多少本书 >>> Book.objects.filter(publisher__name='人民邮电出版社 ...
- Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
随机推荐
- Can't locate Log/Dispatch.pm in @INC /Makefile out-of-date with respect to Makefile.PL
mha check的时候报错问题解决: # masterha_check_ssh --conf=/data/mha/app1.cnf Can't locate Log/Dispatch.pm in ...
- C# 获取QQ好友列表信息的实现
分析部分 当我们访问QQ空间的时候,大家可以在右侧的发现一个这样的统计信息 当点击这个链接的时候,会跳转到 这样一个URL 这个URl可以管理好友,当然也就能读取到好友 上面我们是在浏览器中的操 ...
- 深度学习之softmax回归
前言 以下内容是个人学习之后的感悟,转载请注明出处~ softmax回归 首先,我们看一下sigmod激活函数,如下图,它经常用于逻辑回归,将一个real value映射到(0, ...
- Mina学习之---mina整体流程介绍
现在公司使用的NIO框架一直时候Mina,当然这也的框架还有Netty.虽然一直在用,但只是简单的停留在业务层面,最近面试的时候有问Mina相关的东西.在之前的博客中已经对BIO,NIO,AIO这三种 ...
- CodeForces 1098D. Eels
题目简述:对一个非空正整数(可重)集合$S$,从中选出两个元素$a, b (a \leq b)$,将他们从$S$中删除并将$a+b$加入$S$,重复这个操作直到$S$中只剩下一个元素为止,称为一次[竞 ...
- 【网络爬虫】【java】微博爬虫(四):数据处理——jsoup工具解析html、dom4j读写xml
之前提到过,对于简单的网页结构解析,可以直接通过观察法.手工写正则解析,可以做出来,比如网易微博.但是对于结构稍微复杂点的,比如新浪微博,如果还用正则,用眼睛一个个去找,未免太麻烦了. 本文介绍两个工 ...
- Spring Boot2中配置HTTPS
1.生成证书 使用jdk,jre中的keytool.exe生成自签名的证书,需要配置JAVA_HOME和path环境变量,即jdk的环境变量.命令如下: keytool -genkey -alias ...
- IE8 以上版本兼容
在html的内如下写法 其中最后一行是永远以最新的IE版本模式来显示网页的. 另外加上Emulate模式 Emulate模式后则更重视 (细心的人会注意到,用IE9去访问带有x-ua-compatib ...
- lua基本语法
1.注释-- ; --[[ ]] 2.控制语句: if ..then .. elseif.. then.. else.. end while.. do..end repeat ..u ...
- HDU - 1098 - Ignatius's puzzle - ax+by=c
http://acm.hdu.edu.cn/showproblem.php?pid=1098 其实一开始猜测只要验证x=1的时候就行了,但是不知道怎么证明. 题解表示用数学归纳法,假设f(x)成立,证 ...