分组\聚合\F\Q查询
一、分组和聚合查询
1、aggregate(*args,**kwargs) 聚合函数
通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。
from django.db.models import Avg,Sum,Max,Min
#求书籍的平均价
ret=models.Book.objects.all().aggregate(Avg('price'))
#{'price__avg': 145.23076923076923} #参与西游记著作的作者中最老的一位作者
ret=models.Book.objects.filter(title__icontains='西游记').values('author__age').aggregate(Max('author__age'))
#{'author__age__max': 518} #查看根哥出过得书中价格最贵一本
ret=models.Author.objects.filter(name__contains='根').values('book__price').aggregate(Max('book__price'))
#{'book__price__max': Decimal('234.000')}
2、annotate(*args,**kwargs) 分组函数
#查看每一位作者出过的书中最贵的一本(按作者名分组 values() 然后annotate 分别取每人出过的书价格最高的)
ret=models.Book.objects.values('author__name').annotate(Max('price'))
# < QuerySet[
# {'author__name': '吴承恩', 'price__max': Decimal('234.000')},
# {'author__name': '吕不韦','price__max': Decimal('234.000')},
# {'author__name': '姜子牙', 'price__max': Decimal('123.000')},
# {'author__name': '亚微',price__max': Decimal('123.000')},
# {'author__name': '伯夷 ', 'price__max': Decimal('2010.000')},
# {'author__name': '叔齐','price__max': Decimal('200.000')},
# {'author__name': '陈涛', 'price__max': Decimal('234.000')},
# {'author__name': '高路川', price__max': Decimal('234.000')}
# ] > #查看每本书的作者中最老的 按作者姓名分组 分别求出每组中年龄最大的
ret=models.Book.objects.values('author__name').annotate(Max('author__age'))
# < QuerySet[
# {'author__name': '吴承恩', 'author__age__max': 518},
# {'author__name': '张X', 'author__age__max': 18},
# { 'author__name': '张X杰', 'author__age__max': 56},
# {'author__name': '方X伟', 'author__age__max': 26},
# {'author__name': '游X兵', 'author__age__max': 35},
# {'author__name': '金庸', 'author__age__max': 89},
# { 'author__name': 'X涛', 'author__age__max': 27},
# {'author__name': '高XX', 'author__age__max': 26}
# ] > #查看 每个出版社 出版的最便宜的一本书
ret=models.Book.objects.values('publish__name').annotate(Min('price'))
# < QuerySet[
# {'publish__name': '北大出版社','price__min': Decimal('67.000')},
# {'publish__name': '山西出版社','price__min': Decimal('34.000')},
# {'publish__name': '河北出版社', 'price__min': Decimal('123.000')},
# {'publish__name': '浙江出版社', 'price__min': Decimal('2.000')},
# {'publish__name': '湖北出版社', 'price__min': Decimal('124.000')},
# {'publish__name': '湖南出版社',price__min': Decimal('15.000')}
# ] >
二、F查询与Q查询
仅仅靠单一的关键字参数查询已经很难满足查询要求。此时Django为我们提供了F和Q查询:
1、F 可以获取对象中的字段的属性(列),并对其进行操作;
from django.db.models import F,Q
#F 可以获取对象中的字段的属性(列),并且对其进行操作;
models.Book.objects.all().update(price=F('price')+1) #对图书馆里的每一本书的价格 上调1块钱
2、Q多条件组合查询
Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询;
语法:
fifter(Q(查询条件1)| Q(查询条件2))
fifter(Q(查询条件2)& Q(查询条件3))
fifter(Q(查询条件4)& ~Q(查询条件5))
fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))包含
from django.db.models import F,Q
1、F 可以获取对象中的字段的属性(列),并且对其进行操作;
# models.Book.objects.all().update(price=F('price')+1)
2、Q多条件组合查询
#如果 多个查询条件 涉及到逻辑使用 fifter(,隔开)可以表示与,但没法表示或非得关系
#查询 书名包含作者名的书
book=models.Book.objects.filter(title__icontains='伟',author__name__contains='伟').values('title')
#如何让orm 中得 fifter 支持逻辑判断+多条件查询? Q()登场
book=models.Book.objects.filter(Q(title__icontains='伟') & Q(author__name__contains='伟')).values('title')
book=models.Book.objects.filter(Q(author__name__contains='伟') & ~Q(title__icontains='伟')).values('title') #多条件包含组合查询
#查询作者姓名中包含 方/少/伟/书名包含伟3字 并且出版社地址以山西开头的书
book=models.Book.objects.filter(
Q(
Q(author__name__contains='方') |
Q(author__name__contains='少') |
Q(title__icontains='伟')|
Q(author__name__contains='伟')
)
&
Q(publish__addr__contains='山西')
).values('title')
print(book)
return HttpResponse('OK')
分组\聚合\F\Q查询的更多相关文章
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- orm中的聚合函数,分组,F/Q查询,字段类,事务
目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...
- Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询
一:聚合,分组查询 二:F, Q查询
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- Django ORM (四) annotate,F,Q 查询
annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...
- $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数
一.聚合函数 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #导入 # .查询图书的总价,平均价,最大价,最小价 ...
- python-day71--django多表双下划线查询及分组聚合及F/Q查询
#====================================双下划线的跨表查询===============# 前提 此时 related_name=bookList 属性查询: # 查 ...
- 聚合查询、分组查询、F&Q查询
一.聚合查询和分组查询 1.aggregate(*args, **kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每个参数都指定一个包含在字典中的返回值 ...
- Python数据库查询之组合条件查询-F&Q查询
F查询(取字段的值) 关于查询我们知道有filter( ) ,values( ) , get( ) ,exclude( ) ,如果是聚合分组,还会用到aggregate和annotate,甚至还有万能 ...
随机推荐
- 关于栈、队列、优先队列的应用——UVa11995
这本来是上一篇博客里的内容,但不知道什么原因breakdown了……我就简单放上一道题好了 题意:这道题的题目是“猜猜数据结构”,题意就是给你一些输入输出数据,让你根据这些数据判断是什么数据结构.要猜 ...
- 结合源码浅谈Spring容器与其子容器Spring MVC 冲突问题
容器是整个Spring 框架的核心思想,用来管理Bean的整个生命周期. 一个项目中引入Spring和SpringMVC这两个框架,Spring是父容器,SpringMVC是其子容器,子容器可以看见父 ...
- mysql5.7基于gtid主从重做
master上备份mysql/data/Percona-5721/scripts/xtra_sohmysql_fullbak.sh scp 备份文件到备机 关闭slave service mysql ...
- 刘志梅2017710101152.《面向对象程序设计(java)》第十三周学习总结
实验十三 图形界面事件处理技术 实验时间 2018-11-22 1.理论知识 (1)任何支持GUI的操作环境都要不断地监视按键或点击鼠标这样的事件. JAVA这样的面向对象语言,都将事件的相关的信息 ...
- 通过SQLServer的数据库邮件来发送邮件
前段时间需要做一个发送邮件的功能,于是就花了一点时间研究了一下.发现通过SQLServer就可以发送邮件,只需要配置一下就可以了,而且配置过程很简单.下面来说一下配置过程: 1.启用Database ...
- git 推送远程仓库和删除远程仓库文件
提交到远程仓库需要现在GitHub或gitlab上创建项目,然后才能连接到远程仓库 1.连接远程仓库 # git remote add origin https://github.com/xxxxx ...
- Python全栈开发记录_第十篇(反射及选课系统练习)
反射机制:反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块中寻找指定函数,对其进行操作.也就是利用字符串的形式去对象(模块)中操作(查找or获取or删除or添加)成员,一种基于字符串的事件 ...
- Unsupported major.minor version 52.0报错解决方案
参考了https://blog.csdn.net/zixiao217/article/details/52818658 但我换了JDK版本为1.8后,启动还是报错,经过排查发现,是tomcat配置出问 ...
- C#压缩文件,C#压缩文件夹,C#获取文件
using System; using System.Data; using System.Configuration; using System.Collections.Generic; using ...
- 网易云和QQ音乐api
最近有点闲,听歌的时候遇见好听的想下载却遇到尴尬的事,版权!唉,知道我干什么了吧 网易云音乐 获取排行榜中的歌曲列表 https://music.163.com/discover/toplist?id ...