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 ...
随机推荐
- 第一次作业--Numpy练习
1.创建一个边界值为1而内部都是0的数组,图例如下:[提示:]解此题可以先把所有值都设置为1,这是大正方形:其次,把边界除外小正方形全部设置为0.本题用到numpy的切片原理.多维数组同样遵循x[st ...
- pytest--生成HTML报告
前戏 我们做自动化,测试报告是必不可少的.方便自己查看,也可以供领导查看,一个测试报告就可以说明我们做了哪些事情,pytest-html插件给我们提供了一个很简陋的测试报告,为什么说简陋,因为是真简陋 ...
- 10.12 csp-s模拟测试70 木板+打扫卫生+骆驼
T1 木板 求$[\sqrt{n},n)$间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数 ...
- hw笔试题-01
#include <stdlib.h> #include <stdio.h> #include <string.h> int str_split(char *inp ...
- [算法模版]Prim-完全图最小生成树
[算法模版]Prim-完全图最小生成树 众所周知,对于常用的Kruskal算法,算法复杂度为\(O(m \log m)\).这在大多数场景下已经够用了.但是如果遇到及其稠密的完全图,Prim算法就能更 ...
- 针对.NET Core, Xamarin以及.NET的自动类型安全Rest库: Refit
本文大部分内容是针对Refit官网的翻译. 官网地址: https://github.com/reactiveui/refit Refit是一个类似于Retrofit的Restful Api库,使用它 ...
- 快速认识springcloud微服务
这周浅显的学习了springcloud.简单聊一下微服务.所谓的微服务远远没有我想想的那么高端难以理解,简单说,就是多个服务分布在不同的服务器上,由这些服务互相配合完成某一项任务.那服务和服务之间调用 ...
- Java & PHP RSA 互通密钥、签名、验签、加密、解密
RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Le ...
- Spring源码系列 — Envoriment组件
何为Envoriment Envoriment是集成在Spring上下文容器中的核心组件,在Spring源码中由Envoriment接口抽象. 在Environment中,有两大主要概念: Profi ...
- Mysql综述--数据是如何读存的?(2)
页的结构 页是一种InnoDB管理存储空间的基本单位,它一般大小在16kb左右.实际上存在着许多不同类型的页,我们这次主要介绍的页是用来存储数据的,也叫做索引页. 接下来看看索引页的结构图: 比较重要 ...