什么是聚合查询,就是使用聚合函数做计算

from django.db.models import Count,Avg,Max,Min   #聚合函数要从模块中导入

from django.db.models import F,Q   #与或非得 查询需要从模块倒入F和Q

聚合查询

需求 计算所有书的价格
from django.db.models import Count,Avg,Max,Min,Sum #聚合函数要从模块中导入
ret = models.Book.objects.all().aggregate(Avg('price')) #查询出所有的书然后用聚合函数做平均价格
ret = models.Book.objects.all().aggregate(Max('price')) #计算最大的价格
ret = models.Book.objects.all().aggregate(Min('price')) #计算最小价格
ret = models.Book.objects.all().aggregate(Count('price')) #计算书的总数
ret = models.Book.objects.all().aggregate(Sum('price')) #计算所有数的总价

F和Q查询

# F就是去除表中字段对应的值
# 查询评论数大于阅读数的书
ret=models.Book.objects.filter(commit_num_gt=F('read_num')) #F包裹的就是相当于直接获值取
# 需求把所有评论数加1
ret= models.Book.objects.all().update(commit_num=F('commit_num')+1) # Q查询就是构造出 与& 或| 非 ~ 得关系
ret = models.Book.objects.filter(name='红楼梦',price=20) #这个就是和与&一样的写法
ret = models.Book.objects.filter(Q(name='红楼梦') | Q(price=20)) #这个就是或,名字是红楼梦或者价格是20
ret = models.Book.objects.filter(~Q(name='红楼梦'),price=20) #非就是不是红楼价格是20的

分组查询:用的annotate函数

需求:统计每一本书的作者个数

PS:这个就是多表查询的统计了

group_by谁就是以谁做基表(就是以什么表为基表或字段为依据)

values在annotate函数前,表示group_by, values在annotate后面的表取值

filter在annotate函数前,表示where(就是过滤条件,查找以过滤条件为开头的数据),在后表示having

from app01 import models
from django.db.models import Avg,Max,Sum,Min,Max,Count
'''# 统计每本书作者的个数,以书做分组,然后统计书里面的作者,这个取基表中的任意字段,这里去的是主键'''
ret = models.Book.objects.all().values('pk').annotate(author_num=Count("authors")).values('name','author_num')
''' models.Book.objects.all()就是我要group_by的,以book表做基表 \ values('pk) 就是表示group_by那个字段 \ annotate就是开始分组然后统计分组字段的个数就是数作者做个 \ values就取值,是把书的名字和个数取出)''' '''统计以过滤条件为开头的书的作者的个数'''
rets = models.Book.objects.all().values('pk').filter(name__startswith='红楼').annotate(author_num=Count("authors")).values('name','author_num')
''' models.Book.objects.all()就是以书为基表 \ values('pk')就是表示group_by那个字段 \ 过滤了书名是红楼开头的,所以将红楼开头的全部获取到 、 annotate就是开始分组然后统计分组字段的个数就是数作者做个 \ values就取值,是把书的名字和个数取出) ''' '''统计每本书的作者个数大于1的书'''
retss = models.Book.objects.all().values('pk').annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name', 'author_num')
'''models.Book.objects.all()就是以书为基表 \ values('pk')就是表示group_by那个字段 \ annotate就是开始分组然后统计分组字段的个数,就是数作者做个 \ filter(author_num__gt=1)就author_num是字段大于等于1 \ values就取值,是把书的名字和作者大于1的取出)''' '''查询每个作者出版的书的总价'''
retsss = models.Author.objects.all().values('pk').annotate(m=Sum('book__price')).values('name','m')
''' 以作者为基表 取主键 开始分组 变量m=反向用表名小写__字段 取值 作者名字和总价''' '''查询各个作者出版的书的总价大于25的作者'''
retssss = models.Author.objects.all().values('pk').annotate(m=Sum('book__price')).values('name','m') PS:retssss = models.Author.objects.all().annotate(m=Sum('book__price')).values('name','m') #annotate前values如果不写默认以基表的主键作为group_by的字段

(21)模型层 -ORM之msql 聚合查询,F和Q(与、或、非查询)、分组查询的更多相关文章

  1. (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)

    基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...

  2. (19)模型层 -ORM之msql 跨表查询(正向和反向查询)

    基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...

  3. (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作

    单表操作-增.删.改.查 ret=models.User.objects.filter(id=1)  #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...

  4. (18)模型层 -ORM之msql 多表操作(字段的属性)

    数据库表的对应关系 1.一对一   #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多  #关系确立,关联字段写在多的一方 3.多对多   #多对多的关系 ...

  5. python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)

    昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...

  6. Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介

    没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...

  7. 07 模型层 orm相关查询 F查询Q查询 django开启事务

    一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...

  8. Django模型层—ORM

    目录 一.模型层(models) 1-1. 常用的字段类型 1-2. 字段参数 1-3. 自定义char字段 1-4. 外键关系 二.Django中测试脚本的使用 三.单表操作 3-1. 添加记录 3 ...

  9. Django模型层ORM学习笔记

    一. 铺垫 1. 连接Django自带数据库sqlite3 之前提到过Django自带一个叫做sqlite3的小型数据库,当我们做本地测试时,可以直接在sqlite3上测试.不过该数据库是小型的,在有 ...

随机推荐

  1. [IOS微信] 查看微信原始数据(含沙盒中的数据)

    1.下载PP助手,将苹果手机连接到电脑上, 2.备份数据 备份还原——备份数据——全新备份 3.导出数据 备份还原——还原数据,在右边的列表中找到备份记录,点击“查看”, 在弹出窗口的右侧,找到“Ap ...

  2. shell 流程控制语句

    case语句 case $变量名 in "值1")   如果变量的值等于值1,则执行程序1 ;;  "值2")   如果变量的值等于值2,则执行程序2 ;;   ...

  3. Win10系列:VC++绘制几何图形4

    三角形绘制完成以后,接下来介绍如何给项目添加主入口函数.打开D2DBasicAnimation.h头文件,添加如下的代码定义一个DirectXAppSource类. //定义类DirectXAppSo ...

  4. 将一个xml文件解析到一个list中

    public List<News> getListFromXml(InputStream in) { XmlPullParser parser = Xml.newPullParser(); ...

  5. 【原创】QString 函数 replace()indexOf()、 lastindexOf()

    1.替换函数 示例: QString x = "Say yes!"; QString y = "no"; x.replace(, , y); // x == & ...

  6. JQuery button控制div或者section

    一.项目你需求 点击左边导航栏的某个按钮,右边内容栏显示出,相应的内容 效果如图   二.html与css.jQuery 1.div模式 <!DOCTYPE html PUBLIC " ...

  7. day31 锁 队列 前面课程重点总结

    今日内容: 1.进程的其他方法 2.僵尸进程和孤儿进程(了解) 3.验证进程之间是空间隔离的 4.守护进程 5.进程锁 重点(又叫同步锁,互斥锁) 6.进程队列(重点)  Queue 7.生产者消费者 ...

  8. day17 面向对象-成员

    今日主要学习了: 1 .成员 2. 变量 3. 方法 4.属性 5.私有 1. 成员 在类中你能写的所有内容都是成员 2 .变量 1) 实例变量: 昨天写的就是实例变量 ,由对象去访问的变量 . cl ...

  9. [Leetcode 104]求二叉树的深度Depth of BinaryTree

    [题目] Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...

  10. java动态代理的实现

    1.首先定义一个委托类的接口Subject,应该必须是接口,而不能是抽象类.因为Proxy.newProxyInstance方法的第二个参数需要委托类实现的接口. public static Obje ...