(21)模型层 -ORM之msql 聚合查询,F和Q(与、或、非查询)、分组查询
什么是聚合查询,就是使用聚合函数做计算
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(与、或、非查询)、分组查询的更多相关文章
- (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)
基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...
- (19)模型层 -ORM之msql 跨表查询(正向和反向查询)
基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...
- (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作
单表操作-增.删.改.查 ret=models.User.objects.filter(id=1) #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...
- (18)模型层 -ORM之msql 多表操作(字段的属性)
数据库表的对应关系 1.一对一 #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多 #关系确立,关联字段写在多的一方 3.多对多 #多对多的关系 ...
- python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)
昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...
- Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介
没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...
- 07 模型层 orm相关查询 F查询Q查询 django开启事务
一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...
- Django模型层—ORM
目录 一.模型层(models) 1-1. 常用的字段类型 1-2. 字段参数 1-3. 自定义char字段 1-4. 外键关系 二.Django中测试脚本的使用 三.单表操作 3-1. 添加记录 3 ...
- Django模型层ORM学习笔记
一. 铺垫 1. 连接Django自带数据库sqlite3 之前提到过Django自带一个叫做sqlite3的小型数据库,当我们做本地测试时,可以直接在sqlite3上测试.不过该数据库是小型的,在有 ...
随机推荐
- zabbix3.4.7主动模式监控日志(多关键字)
日志监控原理 1.Zabbix Server和Zabbix Agent会追踪日志文件的大小和最后修改时间,并且分别记录在字节计数器和最新的时间计数器中. 2.Agent会从上次读取日志的地方开始读取日 ...
- Win10系列:JavaScript综合实例4
实现主页面和分类页面的之后,最后来看一下菜肴页面的实现,这个页面用于详细介绍某项菜肴或主食,如名称.图片和具体做法等.在pages文件夹里面添加一个名为foodDetail的文件夹,并在foodDet ...
- poj3261
题解: 同bzoj1717 代码: #include<bits/stdc++.h> using namespace std; ,P2=,P=; int a1[P],num[P],a2[P] ...
- 读书笔记 enum枚举之位标志属性(Flags)浅析
针对enum枚举来说,可以定义位标志属性,从而使该枚举类型的实例可以存储枚举列表中定义值的任意组合.可以用 与(&).或(|).异或(^)进行相应的运算.废话不多说,代码最直接. //每一个定 ...
- [Leetcode 739]*还有几天会升温 Daily Temperatures
[题目] Given a list of daily temperatures T, return a list such that, for each day in the input, tells ...
- IDEA中不同项目配置不同JDK
安装JDK后,选择其中一个配置环境变量,在IDEA中可以给不同项目选择不同的JDK版本.如下图两个项目:
- 201621123001 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 一个进程可以同时运行多个不同线程,不同的线程执行不同的任务 Java线程是通过java.lang包中定义的Thre ...
- CSS学习笔记-04 a标签-导航练习
个人练习,各位大神勿笑 .. <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- js实现网页全屏切换(平滑过渡),鼠标滚动切换
实现效果为页面平滑过渡全屏切换,点击导航和鼠标滚动都可以切换. 效果图: html代码: <!DOCTYPE html> <html> <head lang=" ...
- alter system archive log current作用及和alter system switch logfile区别
alter system archive log current 是归档当前的重做日志文件,不管自动归档有没有打都归档. alter system switch logfile 是强制日志切换,不一定 ...