(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上测试.不过该数据库是小型的,在有 ...
随机推荐
- 基于Quartz.NET 实现可中断的任务(转)
Quartz.NET 是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET 允许开发人员根据时间间隔(或天)来调度作业.它实现了作 ...
- linux操作系统及命令Part 2
cat 命令 cat .txt .txt .txt > Ta.txt 将左边三个文件纵向合并为Ta文件 cat .txt>> Ta.txt 将左边文件的内容添加到Ta文件中 tar ...
- Java 算法 概念汇总
编程面试的10大算法概念汇总 以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java ...
- ssh三大框架整合
spring+struts2+hibernate 参考1:数据库为oracle http://takeme.iteye.com/blog/1678268 参考2:数据库为mysql http://bl ...
- jsp自定义标签开发
参考:http://blog.csdn.net/lw001x/article/details/7589302
- Saiku的基本使用介绍(三)
Saiku的基本使用介绍(这里都是使用Admin用户登录系统) 1.启动安装好的Saiku ( ./start-saiku.sh ) ,浏览器使用访问系统 http://localhost:8080 ...
- [Leetcode 44]通配符匹配Wildcard Matching
[题目] 匹配通配符*,?,DP动态规划,重点是*的两种情况 想象成两个S.P长度的字符串,P匹配S. S中不会出现通配符. [条件] (1)P=null,S=null,TRUE (2)P=null, ...
- python中各种遇到的函数
函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...
- SharePoint Framework 把你的客户端web部件部署到经典的SharePoint页面
博客地址:http://blog.csdn.net/FoxDave 本节介绍如何把客户端web部件部署到SharePoint服务端页面.我们将继续使用之前的工程. 将HelloWorld的web部 ...
- get 和post 请求的写法
get请求 import requests base_url = 'http://httpbin.org' # 定义请求所需的参数,参数之间以英文逗号隔开 param_data = {'} # 发送G ...