博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(21)模型层 -ORM之msql 聚合查询,F和Q(与、或、非查询)、分组查询
阅读量:5250 次
发布时间:2019-06-14

本文共 2794 字,大约阅读时间需要 9 分钟。

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

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的字段

 

转载于:https://www.cnblogs.com/shizhengquan/p/10528655.html

你可能感兴趣的文章
Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间
查看>>
很开心
查看>>
创建类的理由
查看>>
什么是变量?注意变量命名区分大小写
查看>>
day3
查看>>
关于XILINX芯片IO管脚的上拉电阻的疑问
查看>>
php 视频 切片上传 秒传
查看>>
Trie树详解及其应用
查看>>
Elasticsearch 1.4.X 的CORS设置
查看>>
数据库-io检测工具sqldeveloper-18.2.0.183.1748-x64 下载链接
查看>>
DataTable的Select()方法
查看>>
在vue项目中引入jssdk所遇到的各种问题
查看>>
Java学习个人备忘录之异常
查看>>
【FunnyBear的Java之旅 - Spring篇】Spring 静态资源
查看>>
Java面试集合(四)
查看>>
(21)打鸡儿教你Vue.js
查看>>
记账本程序四
查看>>
【线性表】动态分配空间的实现
查看>>
luogu2732商店购物
查看>>
Apache 相关 mod_rewrite ,RewriteCond,{HTTP_HOST}
查看>>