Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作
Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作
聚合查询
记住用到关键字aggregate
然后还有几个常用的聚合函数就好了
from django.db.models import Max,Min,Count,Sum,Avg
#分别是最大、最小、记录个数、求和及平均值
res = models.Book.objects.all().aggregate(Avg('price'))
res1 = models.Book.objects.all().aggregate(Max('price'))
res2 = models.Book.objects.all().aggregate(Min('price'))
res3 = models.Book.objects.all().aggregate(Sum('price'))
res4 = models.Book.objects.all().aggregate(Count('title'))
res5 = models.Book.objects.all().aggregate(Avg('price'),Max('price'),Min('price'),Sum('price'),Count('title'))
分组查询
记住用到关键字annotate
然后下面几个例子
#1.统计每一本数的作者个数
res = models.Book.objects.annotate(author_num = Count('authors')).values('author_num')
print(res)
#2.统计每个出版社卖出的最便宜的书的价格
res = models.Publish.objects.annotate(price_min=Min('book__price')).values('price_min')
print(res)
#3.统计不止一个作者的图书
"""
先统计出每本图书对应的作者个数
再筛选出其中个数大于1的书名
"""
res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('author_num')
print(res)
#4.查询各个作者出的书的总价格
res = models.Author.objects.annotate(sum_price=Count('book__price')).values('sum_price')
print(res)
F与Q查询
有这样一个需求:我们之前在查询数据库的时候条件都是我们自己手写的但是现在出现了条件是从数据库里面获取的
"""
我们在需要在book表中新建两个字段, 分别是 stock(库存)和sale(销售量),这里要注意了,新建字段,要么设置默认值,要么加一个null=True,否则将会报错
"""
from django.db.models import F,Q
##F查询
#1.查询出卖出数大于库存数的书籍
models.Book.objects.filter(sale__gt=F('stock'))
#2.将所有数的价格 全部提高100块
models.Book.objects.update(price=F('price') + 100)
#3.将所有书的名字后面加上 爆款 二字(这里需要用到数据库里面的拼接方法 Concat 同时要跟上拼接值Value)
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(name=Concat(F('name'), Value('爆款')))
##Q查询
#1.查询科比自传或者价格是1000的书
res = models.Book.objects.filter(Q(title="科比自传")|Q(price=1000)) # |/,/~表示或与非
#2.Q进阶 产生Q对象 然后再使用
q=Q()
q.connector = 'or'
q.children.append(('title__icontains','p'))
q.children.append(('stock',666))
res = models.Book.objects.filter(q)
print(res)
#这样查到的就是 书名包含p/P或者是库存是666的书对象
##惰性查询(必须使用才会给你打印结果要不然就是空)
# only方法
res = models.Book.objects.only('title')
for r in res:
# print(r.title) #只有一条SOL语句对应多个查询结果
print(r.price) #有几个结果就有几个查询语句
'''
only会将括号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库 一旦你点了不是括号内的字段 就会频繁的去走数据库查询
'''
# defer方法
res = models.Book.objects.defer('title') # defer和only互为反关系
for r in res:
print(r.title) #有几个值就打印几句sql语句
'''
defer会将括号内的字段排除之外将其他字段对应的值 直接封装到返回给你的对象中 点该其他字段 不需要再走数据库
一旦你点了括号内的字段 就会频繁的去走数据库查询
'''
# select_related 方法
res = models.Book.objects.select_related('publish')
for r in res:
print(r.publish.addr)
"""
select_related 会自动帮你做连表操作 然后将连表之后的数据全部查询出来封装给对象(连接查询,只输出一条sql语句)
select_related括号内只能放外键字段
并且多对多字段不能放
如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)
"""
# prefetch_related 方法
res = models.Book.objects.prefetch_related('publish')
print(res)
for r in res:
print(r.publish.name)
"""
prefetch_related 看似连表操作 其实是类似于子查询(会打印出两个sql语句)
prefetch_related括号内只能放外键字段
并且多对多字段不能放
如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)
"""
## select_related和prefetch_related方法的特点
'''
第一个 内部自动连表 消耗的资源就在连表上 但是走数据库的次数较少
第二个 内部不做连表 消耗的资源就在查询次数上 但是给用户的感觉跟连表操作一样
'''
Django中如何开启事务
from django.db import transaction
with transaction.atomic():
# 在该代码块中所写的orm语句 同属于一个事务
# 缩进出来之后自动结束
#例如:
'''
michael给jackson转100元
那么在数据层要做的事
1.创建一条订单数据
2.michael钱减100,jackson钱加100
'''
from django.db.models import F
from django.db import transaction
#开启事务处理
try:
with transaction.stomic():
#创建一条订单数据
models.Order.objects.create(num='1110101001', user_id = 1, user_id = 2, count=1)
#能执行成功
models.User.objects.filter(id=1).update.(money=F("money")-100) #michael
models.User.objects.filter(id=2).update.(money=F('money')+100) #jackson
except Exception as e:
print(e)
Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作的更多相关文章
- Django 聚合分组F与Q查询及choices
一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...
- django----聚合查询 分组 F与Q查询 字段 及其 参数
目录 一.orm补充查询 聚合查询 1-1 分组查询 1-2 F与Q查询 1-3 二. 字段及其参数 常用字段 AutoField IntegerField CharField DateField D ...
- Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...
- Django 聚合查询 分组查询 F与Q查询
一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...
- 70 多表查询的分组F 聚合 Q 查询
聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函 ...
- Django中多表的增删改查操作及聚合查询、F、Q查询
一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...
- Django ORM 之F、Q查询与事务
返回ORM目录 Django ORM 内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 20 ...
- django基础之day05,F与Q查询,Q查询的高级用法
#F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...
- django F与Q查询 事务 only与defer
F与Q 查询 class Product(models.Model): name = models.CharField(max_length=32) #都是类实例化出来的对象 price = mode ...
随机推荐
- ES6 Set求两个数组的并集、交集、差集;以及对数组去重
并集: const arr1 = [1, 2, 3, 2, 5]; const arr2 = [1, 4, 6, 8, 3]; // 将两个数组合并 const concatArr = [...arr ...
- linux shell攻略学习笔记一 基础篇
1.#!/bin/bash shebang 可以自定义 比如 #!/bin/bash +x 就会打印出执行日志 linux中 \ 代表null \n2\n3” 会转义其中的\n,生成3行数据 $! 保 ...
- 如何运用C语言求(判断)素数。
int i,n; scanf("%d",&n); i=2; //这一步是亮点!! while(i<n) { if(n%i==0) break; i++; } if ...
- JSX中引用CSS的一种方法
第一步:在page或者pages目录下新建一个css文件,例如style.css: 第二步:在jsx页面中import该css文件,例如: import style from './style.css ...
- 解惑:在Ubuntu18.04.2的idea上运行Scala支持的spark程序遇到的问题
解惑:在Ubuntu18.04.2的idea上运行Scala支持的spark程序遇到的问题 一.前言 最近在做一点小的实验,用到了Scala,spark这些东西,于是在Linux平台上来完成,结果一个 ...
- 支付宝AopSdk在dotnet core下的实现
随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移.之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framew ...
- Zookeeper 到底能帮我们解决哪些问题?
Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通 ...
- sudo: ulimit: command not found
在这看到的:http://stackoverflow.com/questions/17483723/command-not-found-when-using-sudo-ulimit 修改系统文件打开数 ...
- Kafka学习笔记之Kafka High Availability(下)
0x00 摘要 本文在上篇文章基础上,更加深入讲解了Kafka的HA机制,主要阐述了HA相关各种场景,如Broker failover,Controller failover,Topic创建/删除,B ...
- webform的原生操作图片预览和上传
1.使用input标签进行图片操作,input的标签有一个accept属性,accept 属性只能与 <input type="file"> 配合使用.它规定能够通过文 ...