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

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

 1  # 分组
 2     # 统计每一本书作者个数
 3     from django.db.models import Count,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)

 

原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9635284.html

时间: 2024-11-13 08:13:49

Django分组查询的相关文章

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu

Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

Django Mysql数据库-聚合查询与分组查询

一.聚合查询与分组查询(很重要!!!) 聚合查询:aggregate(*args, **kwargs),只对一个组进行聚合 from django.db.models import Avg,Sum,Count,Max,Min # 1.查询所有图书的平均价格 print(models.Book.objects.all().aggregate(Avg("price"))) aggregate()是QuerySet 的一个终止子句(也就是返回的不再是一个QuerySet集合的时候),意思是说

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

django 数据库查询

class Poll(models.Model): slug = models.SlugField(unique_for_month='pub_date')question = models.CharField(maxlength=255)pub_date = models.DateTimeField()expire_date = models.DateTimeField() def __repr__(self):return self.question class Meta:get_lates

django 数据库查询 ORM

单表操作: 添加记录: # 方式1: #obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100) 注意:Book.objects.create()的返回值是当前添加的记录对象这种方式不需要save() # 方式2: book_obj=Book(title="python2",publishDate="2012-12-12",price=

5 功能4:个人站点页面设计(ORM跨表与分组查询)

1.个人站点页面文章的查询 # 个人站点 http://www.cnblogs.com/wh1520577322/ http://www.cnblogs.com/liucong12345/ http://www.cnblogs.com/kin1492/ (1)用户未找到,404页面构建 url # 个人站点页面设计 re_path(r'^(?P<username>\w+)$', views.home_site, name='home_site'), view 404.html <!DOC

orm聚合查询、分组查询、F查询和Q查询

1.聚合查询(Avg,Count,Max,Min,Sum) Avg为求平均数,Count为求个数,Max为求最大值,Min为求最小值,Sum为求和 以Avg举例 from django.db.models import Avg,Count,Max,Min,Sum ret=Book.objects.all().aggregate(Avg('price')) //其中price必须是以有的字段 2.分组查询 ? 要点: ? values在annotate前,表示group by,在annotate后

BBS--功能4:个人站点页面设计(ORM跨表与分组查询)

查询: 日期归档查询 1 date_format ============date,time,datetime=========== create table t_mul_new(d date,t time,dt datetime); insert into t_mul_new values(now(),now(),now()); select * from t_mul; mysql> select * from t_mul; +------------+----------+---------