Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
1. 聚合查询
aggregate(*args, **kwargs)
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。
代码示例:
# 计算所有图书的平均价格
>>> from django.db.models import Avg
>>> Book.objects.all().aggregate(Avg('price'))
# 结果:
{'price__avg': 34.35} >>> Book.objects.all().aggregate(a=Avg('price')) # 或者给它起名字:aggretate(a=Avg('price'))
# 结果:
{'a': 34.35}
>>> Book.objects.aggregate(average_price=Avg('price'))
# 结果:
{'average_price': 34.35}
如果希望生成不止一个聚合,可以向aggregate()子句中添加另一个参数。
例如:如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
>>> from django.db.models import Avg, Max, Min
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
# count('id'),count(1)也可以统计个数 #结果:
{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}
2. 分组
annotate
代码示例:
models.Publish.objects.annotate(avg_price=Avg('book__price')).values('avg_price')
# objects后面不写values默认是以id为依据分组 models.Book.objects.values('publish_id').annotate(avg_price=Avg('price'))
# objects后面写values,以values里边的字段为依据进行分组
# 结果:
# {'pulish_id':1,'avg_price':11.11} # 分组后排序:
Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')
注意:annotate里面必须写个聚合函数,不然没有意义,并且必须有个别名=,别名随便写,但是必须有,用哪个字段分组,values里面就写哪个字段,annotate其实就是对分组结果的统计,统计你需要什么。
3. F查询和Q查询
F查询 /针对自己单表中字段的比较和处理
from django.db.models import F models.Book.objects.filter(good__gt=F('comment'))
models.Book.objects.all().update(price=F('price')+100)
Q查询 /与& 或| 非~/针对多个条件的或与非进行查询
from django.db.models import Q filter(Q(xx=11)|Q(ss=22)&Q(oo=33))
filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33)) # &优先级高,先执行后面的&运算,再执行前面的|运算
filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33),name='dd') # 逗号(,)隔开的话,优先级是先执行完前面的或(|),再执行逗号(,)后面的and关系
4. orm执行原生sql
方式一:只能对本表进行原生sql操作
models.Publish.objects.raw('原生sql')
# <RawQuerySet: select * from app01_publish;> # 代码示例:
def test(request):
ret = models.Publish.objects.raw('select * from app01_publish;')
for i in ret:
print(i)
return HttpResponse('Test is completed')
方式二:对所有的表都可以进行原生sql操作
from django.db import connection
cursor = connection.cursor()
cursor.execute(sql,[arg,]) # [arg,] -- 参数
cursor.fetchall() # 代码示例:
from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from app01_publish;')
print(cursor.fetchall())
return HttpResponse('Test is completed')
5. 展示orm转换成原生sql语句
显示orm语句转换成的原生sql语句
models.Book.objects.filter(good__gt=F('comment')*2)
from django.db import connection
print(connection.queries)
6. 设置 sql_mode
1.查看当前会话的sql_mode:
select @@sql_mode
2.设置当前会话的sql_mode:
set @@sql_mode = 'only_full_group_by';
3.设置全局会话的sql_mode:
set global sql_mode = 'only_full_group_by';
4.在配置文件中修改
7. orm查询示例
代码示例:
def test(request):
from django.db.models import Max,Avg,Q
# 1 查询每个作者的姓名以及出版的书的最高价格
ret = models.Author.objects.annotate(max_price=Max('book__price')).values('name','max_price')
print(ret) # 2 查询作者id大于2作者的姓名以及出版的书的最高价格
ret = models.Author.objects.filter(id__gt=2).annotate(max_price=Max('book__price')).values('name','max_price')
print(ret) # 3 查询作者id大于2或者作者年龄大于等于20岁的女作者的姓名以及出版的书的最高价格
ret = models.Author.objects.filter(Q(id__gt=2)|Q(age__gte=20),sex='female').annotate(max_price=Max('book__price')).values('name','max_price')
print(ret) # 4 查询每个作者出版的书的最高价格的平均值
ret = models.Author.objects.annotate(max_price=Max('book__price')).aggregate(Avg('max_price'))
print(ret) # 5 每个作者出版的所有书的最高价格以及最高价格的那本书的名称(orm查询会有问题)
ret = models.Author.objects.annotate(a=Max('book__price')).values('a','book__title')
print(ret)
# 分组后取到的书名只有一个,取的都是每组的第一个 # 原生sql查询
# select * from
# (select app01_author.id, app01_book.title, app01_book.price from app01_author
# inner join app01_book_authors on app01_author.id=app01_book_authors.author_id
# inner join app01_book on app01_book_authors.book_id=app01_book.id order by app01_book.price)
# as t1 group by t1.id;
return HttpResponse('Test is completed') # 注意点:
# 1.as t1 是将查出来的一张虚拟表合并成一张表,里边有重复的字段合不成一张表(同一张表不能出现重复的字段),应该select出需要的字段,再合并成一张表
# 2.分组是对新合成的t1表进行分组
Django框架08 /聚合查询、分组、F/Q查询、原生sql相关的更多相关文章
- Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询
一:聚合,分组查询 二:F, Q查询
- 聚合查询、分组查询、F&Q查询
一.聚合查询和分组查询 1.aggregate(*args, **kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每个参数都指定一个包含在字典中的返回值 ...
- $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数
一.聚合函数 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #导入 # .查询图书的总价,平均价,最大价,最小价 ...
- django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066
1 聚合和分组 聚合:对一些数据进行整理分析 进而得到结果(mysql中的聚合函数) 1aggregate(*args,**kwargs) : 通过对QuerySet进行计算 ,返回一个聚合值的字典. ...
- 聚合和分组F,Q和事物,cookie,session
聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典. 键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函数的名称自动生成出 ...
- Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)
Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...
- orm中的聚合函数,分组,F/Q查询,字段类,事务
目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...
- Django ORM (四) annotate,F,Q 查询
annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...
- 分组\聚合\F\Q查询
一.分组和聚合查询 1.aggregate(*args,**kwargs) 聚合函数 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每一个参数都指定一个包含在字典中的 ...
随机推荐
- TensorFlow从0到1之XLA加速线性代数编译器(9)
加速线性代数器(Accelerated linear algebra,XLA)是线性代数领域的专用编译器.根据 https://www.tensorflow.org/performance/xla/, ...
- 能被 K 整除的最大连续子串长度
[来源]网上流传的2017美团秋招笔试题 [问题描述] 两个测试样例输出都是5 [算法思路] 暴力解法时间会超限,使用一种很巧妙的数学方法.用在读取数组arr时用数组sum记录其前 i 项的和,即 s ...
- 警告Establishing SSL connection without server's identity verification is not recommended
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] SpringBo ...
- .NETCore微服务探寻(二) - 认证与授权
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
- 爬取B站弹幕并且制作词云
目录 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 制作词云 1.文件读取 2.代码 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 import requests from l ...
- Head First 设计模式
OO基础 抽象 封装 多态 继承 OO原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间的松耦合设计而努力 对扩展开放,对修改关闭 依赖抽象,不要依赖具体类 最少知识原则 ...
- 1166 - Unknown error 1166[mysql 错误
错误码 1166 原因 字段名因为是复制过来的, 末尾存在了一个空格换行
- ajax前后端交互原理(6)
6.XMLHttpRequest对象 XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能.它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页 ...
- 解密TaurusDB存储端高并发之线程池
摘要:为了能加快相关任务的高效执行,TaurusDB采用多线程技术处理的方式,增加处理器单元的吞吐能力,从而提高存储端的执行效率. 1. TaurusDB背景 随着云计算进入2.0时代,数据急剧膨胀, ...
- python数据结构(一)
collections --容器数据类型,collections模块包含了除内置类型list,dict和tuple以外的其他容器数据类型. Counter 作为一个容器可以追踪相同的值增加了多少次 # ...