Django-model聚合查询与分组查询

  1. 聚合函数包含:SUM AVG MIN MAX COUNT
  2. 聚合函数可以单独使用,不一定要和分组配合使用;不过聚合函数一般和group by 搭配使用
  3. aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
  4. 分组查询 annotate 查询出来的结果任然是集合是QuerySet类型;
  5. annotate对获取的集合进行分组,按照集合的个数分组;

聚合查询的使用aggregate()来调用

1.查询所有书籍的总价格

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
# 统计所有书籍的总价格 aggregate 用来调用聚合函数的
# 可以通过binming= 来定义别名为 binming
book_list=models.Book.objects.all().aggregate(binming=Sum("price"))
print(book_list)
return HttpResponse("OK")

输出:

{'binming': Decimal('5144.00')}

2.查询出所有书籍的平均价格

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_list=models.Book.objects.all().aggregate(AVG_binming=Avg("price"))
print(book_list)
return HttpResponse("OK")

输出:

{'AVG_binming': 16.12539184952978}

3.同时查询出,这些书籍的平均值,最大值,和最小值

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_list=models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))
print(book_list)
return HttpResponse("OK")

输出:

{'price__max': Decimal('111.00'), 'price__min': Decimal('11.00'), 'price__avg': 16.12539184952978}

分组查询 annotate()来调用

1.统计书本有作者的记录,并求出该书有 几个作者

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.filter(authors__age__gt=0).annotate(c=Count("authors"))
print(book_obj.values_list("title","c")) return HttpResponse("OK")

输出:

<QuerySet [('三国演义', 3), ('红楼梦1', 1), ('李四的歌', 1), ('ccc', 3)]>

2.统计每个出版社,出版书籍价格的总和

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Publish.objects.all().annotate(c=Sum("book__price"))
print(book_obj.values_list("name","c"))
return HttpResponse("OK")

输出:

<QuerySet [('小黄人出版社', Decimal('595.00')), ('小红帽出版社', Decimal('4428.00')), ('红太阳出版社', Decimal('121.00'))]>

3.统计每个出版社,出版过的书籍数量

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Publish.objects.all().annotate(c=Count("book__title"))
print(book_obj.values_list("name","c"))
return HttpResponse("OK")

输出:

<QuerySet [('小黄人出版社', 30), ('小红帽出版社', 284), ('红太阳出版社', 5)]>

4.通过Book表查出每个出版社出版过书籍的本数;

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
# 先获取所有的书本集合set,根据集合取出出版社对象几个;按照出版社集合分组,计数出版社出版的书籍数量
book_obj=models.Book.objects.all().values_list("publisher__name").annotate(c=Count("title"))
# 取出出版数量c ,以及出版社的名称
print(book_obj.values_list("c","publisher__name"))
return HttpResponse("OK")

5.统计出书名以"三"开头的书籍,作者的个数;

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.filter(title__startswith="三", authors__age__gt=0).annotate(c=Count("authors"))
print(book_obj.values_list("c","title"))
return HttpResponse("OK")

输出:

<QuerySet [(3, '三国演义'), (2, '三毛流浪记')]>

6.统计作者个数大于一个人的书籍

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.all().annotate(c=Count("authors")).filter(c__gt=1)
print(book_obj.values_list("c","title"))
return HttpResponse("OK")

输出:

<QuerySet [(3, '三国演义'), (3, 'ccc'), (2, '三毛流浪记')]>

F查询与Q查询

  1. F()的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
  2. F()也可以用来做直接的运算;

F查询(可以获取某个字段值):

1.查询出,评论数大于阅读数的书籍

from django.db.models import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(comment_num__gt=F("read_num"))
print(book_obj.values_list("title"))
return HttpResponse("OK")

输出:

<QuerySet [('小兵张嘎',), ('人鱼传说',), ('小红书',), ('小红书',), ('小红书',), ('三国演义',)]>

2.查询出,评论数是阅读数2倍的书籍;

from django.db.models import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(comment_num__gt=F("read_num")*2)
print(book_obj.values_list("title"))
return HttpResponse("OK")

输出:

<QuerySet [('人鱼传说',), ('小红书',), ('小红书',), ('小红书',), ('三国演义',)]>

3.将所有的书籍价格+10

from django.db.models import F,Q
def FQQuery(request):
models.Book.objects.all().update(price=F("price")+10) return HttpResponse("OK")

Q 查询:使用(|或 &且)

1.评论数大于100或阅读数大于100的书本---|

from django.db.models import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(Q(comment_num__gt=100)|Q(read_num__gt=100))
print(book_obj.values_list("title"))
return HttpResponse("OK")

输出:

<QuerySet [('人鱼传说',), ('三国演义',)]>

ORM修改和ORM删除

1.ORM修改

   1 obj.name="egon"  obj.save()  效率低
2 表.objects.all().update(name="") 推荐 注意点:update方法是QuerySet数据类型的方法。model对象不能调用。

2.ORM删除

   表.objects.filter().delete()

   注意事项:
1 、 delete()是QuerySet数据类型的方法
2 、 级联删除

Django-model聚合查询与分组查询的更多相关文章

  1. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  2. Django进阶Model篇007 - 聚集查询和分组查询

    接着前面的例子,举例聚集查询和分组查询例子如下: 1.查询人民邮电出版社出了多少本书 >>> Book.objects.filter(publisher__name='人民邮电出版社 ...

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

    django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...

  4. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  5. 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)

    一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段   示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...

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

    一.聚合查询与分组查询(很重要!!!) 聚合查询:aggregate(*args, **kwargs),只对一个组进行聚合 from django.db.models import Avg,Sum,C ...

  7. python全栈开发day68-ORM操作:一般操作、ForeignKey操作、ManyToManyField、聚合查询和分组查询、F查询和Q查询等

    ORM操作 https://www.cnblogs.com/maple-shaw/articles/9403501.html 一.一般操作 1. 必知必会13条 <1> all(): 查询 ...

  8. 基于对象的跨表查询,多对多查询,多对多操作,聚合查询和分组查询,F查询和Q 查询

    基于对象的跨表查询 一对多查询(班级表和学生表) 表结构创建 class Class(models.Model): id = models.AutoField(primary_key=True) cn ...

  9. Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)

    摘要: 单表查询 多表查询 聚合查询 分组查询 一.Django ORM 常用字段和参数: 常用字段:#AutoFieldint自增列,必须填入参数primary_key = True,当model中 ...

随机推荐

  1. xv6 + Qemu 在Ubuntu下编译运行教程【转】

    转自:https://blog.csdn.net/yinglang19941010/article/details/49310111 如果想要离线看教程,可以下载该 文档 一.使用工具说明 1.    ...

  2. win7 vs2012/2013 编译boost 1.55

    bjam install stage --toolset=msvc-11.0 --stagedir="C:\Boost\boost_vc_110" link=shared runt ...

  3. 题解-CodeForces700E Cool Slogans

    Problem 题目链接 题目大意:给定一个字符串,每次取出出现至少两次的子串替换原串,问最多能替换多少次,输出答案加一(字符串长为\(2×10^5\)) Solution 前置技能:SAM.线段树合 ...

  4. hibernate框架学习之多表查询helloworld

    package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...

  5. vue路由vue-router的使用

    对于单页应用,官方提供了vue-router进行路由跳转的处理. 安装 基于传统,我更喜欢采用npm包的形式进行安装. npm install vue-router --save 当然,官方采用了多种 ...

  6. 【笔记】[WIN7x64] ThinkPad E420开机不能按设置关闭触控板的问题

    将win7x32重装为Win7x64后,TouchPad(以下简称TP)就不能在开机时按照在控制面板-鼠标中的设置关闭TP, 从而每次开机都必须去点开控制面板->鼠标 才能关闭TP.因为通常不用 ...

  7. QPainter

    1.QPainter使用save()函数来保存QPainter的状态,并且用restore()函数来使他们回退. void MainWindow::paintEvent(QPaintEvent *ev ...

  8. mysql:批量插入不同的UUID

    INSERT INTO t_base_role_resource_ref (refID, roleID, resID, orgID, belongTo) SELECT uuid() AS refID, ...

  9. 模块 -- 序列化 hashlib sha logging (加密 加盐 )

    模块:  一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...

  10. Codeforces 487E Tourists [广义圆方树,树链剖分,线段树]

    洛谷 Codeforces 思路 首先要莫名其妙地想到圆方树. 建起圆方树后,令方点的权值是双联通分量中的最小值,那么\((u,v)\)的答案就是路径\((u,v)\)上的最小值. 然而这题还有修改, ...