Django分组查询

摘要:
先补充两个知识点:1.groupby大前提:可以按照任意字段分组,但是最好是按照分辨度比较低的来分组。groupby分组可以单独使用,不搭配其他条件。分组主要是为了查看分组后该字段每个组的个数selectpost,count(*)fromempwhereid˃3groupbyposthavingcount˃52.havinghaving是将通过where查询出的记录再次进行过滤,可以使用聚合函数。下面可以进入Django分组查询正题:annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值。

先补充两个知识点:

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成一张表,再按单表的思路进行分组查询。

把分组出来的每一个对象都进行聚合!!!

1  #分组
2     #统计每一本书作者个数
3     from django.db.models importCount,Min,Max
4     #ret=Book.objects.all().annotate(author_num=Count('authors__nid')).values('name','author_num')
5     #values 在这里代指group by 的字段
6     #ret=Book.objects.all().values('name').annotate(author_num=Count('authors__name')).values('name','author_num')
7     #print(ret)
8     #for book in ret:
9     #print(book.name,":",book.c)
10     #print(ret)
11     #统计每一个出版社的最便宜的书
12     #ret=Publish.objects.all().annotate(c=Min('book__price')).values('name','c')
13     #for pub in ret:
14     #print(pub.name,":",pub.c)
15     #print(ret)
16     #统计每一本以py开头的书籍的作者个数:
17     #ret=Book.objects.all().filter(name__startswith='红').annotate(c=Count('authors__nid')).values('name','c')
18     #print(ret)
19     #统计不止一个作者的图书:(作者数量大于一)
20     #注意:valu再annotate前,代表group by 的字段,不写value,默认以基表的主键做group by 在后代表我要select出来的字段
21     #filter在前,代指where的东西,在后,代表having 的东西
22     #ret = Book.objects.all().values('name').annotate(author_num=Count('authors__name')).filter(author_num__gt=1).values('name','author_num')
23     #print(ret)
24     #练习:查询各个作者出的书的总价格:
25     #ret=Author.objects.all().annotate(c=Sum('book__price')).values('name','c')
26     #print(ret)
27     #查询每个出版社的名称和书籍个数
28     #ret=Publish.objects.all().annotate(c=Count('book__nid')).values('name','c')
29     #ret=Publish.objects.all().annotate(c=Count('book')).values('name','c')
30     #print(ret)

免责声明:文章转载自《Django分组查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇B14-iOS开发中的几种存储方式Windows安装项目卸载快捷方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

django实现支付宝支付

目录 django支付宝支付 新建支付宝应用 创建应用(使用沙箱环境测试) 按照官方要求生成私钥(可以上支付宝开发平台下载支付宝开发助手) 把生成的app公钥粘贴到沙箱的app中 查看沙箱账号和密码 支付宝开发地址 说明 在utils中封装请求支付宝扫码地址url的函数和生成订单id的函数 在model.py中定义表 在views.py中...

Django使用第三方模块django-password-reset重置密码

网上关于django第三方模块django-password-reset重置密码的几篇博客有一个严重的bug 见博客:https://blog.csdn.net/qq_42820268/article/details/81940353 中的内容。 关键是:上文提到的urls.py配置, 出现错误,并提出解决办法,实际上并没有解决,应该写为:url(r'^...

django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 哈欠涟涟的日志 网易博客

django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 - 哈欠涟涟的日志 - 网易博客 django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 2010-05-28 11:12:25|分类:django|标签:|字号大中小订阅 在http:...

Django之博客系统:用户登陆

使用django有一个好处就是有各种各样的框架可以拿来直接使用。相比flask,django自带的框架确实要多很多。比如这一章就要介绍的用户登录。Django拥有一个内置的认证(authentication)框架用来操作用户认证(authentication),会话(sessions),权限(permissions)以及用户组。这个认证(authentic...

Django之ORM正反向查询

Django之ORM正反向查询 在orm查询中,一般分为正向查询和反向查询。至于什么是正向查询和反向查询,还要从表关系说起。举个简单的例子,就拿图书和出版社来说,一般一个图书只有一个出版社,但是一个图书一般有多个图书,外键关系一般建立在多的一侧,也就是说,外键关系是建立在图书的表模型中的。而正向查询就是从多的一侧出发,即图书表出发去查找。举例如下:查找出版...

Django框架深入了解——Django中的缓存

Django框架深入了解——Django中的缓存 一、Django中的缓存: 前言: ​ 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力. 缓存是将一些常用的数...