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

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. ci框架memcached使用

    首先第一步需要安装memcached扩展 安装方法这里就不叙述了 application/config/memcached.php配置 $config = array( 'default' => ...

  2. DAY27.XIA.面向對象

    2018-07-23  08:43:17

  3. 逆袭之旅DAY09.东软实训.接口

    2018年7月5日 package day0705.teacher.test1usb; /** * 测试类 * @author Administrator * */ public class UsbI ...

  4. bzoj2946

    题解: 和poj1226差不多 把翻转去掉 然后不要忘记开大数组和二分的上限答案 代码: #include<bits/stdc++.h> using namespace std; type ...

  5. mysql插入中文乱码

    https://www.cnblogs.com/zhchoutai/p/7364835.html 最简单的一招,不用修改my.ini文件: 1.停掉mysql服务 2.启动:X:\%path%\MyS ...

  6. [POJ3378]Crazy Thairs

    Problem 给你一个数列,让你求由五个元素组成的顺序对的个数. Solution DP:用DP[i][j]表示把第j个作为五元组中第i个的方案数 则DP[i][j]=sum{DP[k][j-1]} ...

  7. libiconv库的安装和使用

    1.libiconv包的下载路径 包的下载页面http://www.gnu.org/software/libiconv/ 2.编译安装libiconv库 $tar zxvf libiconv-1.14 ...

  8. opencv3.0+vs2013安装记录

    为了能够更好的学习图像,我觉得opencv是一个必不可少的库,因此在以后的研究上使用opencv作为研究工具,与大家共同进步. 话归正题:先搭建opencv的环境. 1.下载安装包3.0 a,官网打开 ...

  9. Ubuntu 14.04 安装 Xilinx ISE 14.7 全过程(转)

    reference:https://www.cnblogs.com/tracyone/p/3561781.html 按照ISE后,建立ISE启动连接: 这个帖子作为我安装xilinx ISE 14.7 ...

  10. 基于MicroBlaze 的嵌入式系统设计

       reference: http://xilinx.eetrend.com/d6-xilinx/article/2013-03/3863.html 摘 要:当今时代,嵌入式系统已经无所不在,与人们 ...