Django之ORM查询优化
res = models.Book.objects.all()
# 如果此时直接运行,不调用这个结果,终端将什么也不会打印出来
# 原因:惰性查询,减少不必要的数据库操作,降低数据库的压力
only 和 defer
only 的优化机制:
res = models.Book.objects.only('title') # 括号内查询的字段可以有多个
print(res) # 查询一次,打印一条sql查询语句
for i in res:
print(i.title) # 查询一次,打印一条sql查询语句
print(i.price) # 有几个对象,就查询几次,打印几条sql查询语句
defe 的优化机制:
res = models.Book.objects.defer('title') # 括号内查询的字段可以有多个
print(res) # 查询一次,打印一条sql查询语句
for i in res:
print(i.title) # # 有几个对象,就查询几次,打印几条sql查询语句
print(i.price) # 查询一次,打印一条sql查询语句
only 与 defer 的区别:
共同点:两者括号内都可以放数据库字段,查询结果都是一个列表套一个个的数据对象。
不同点:
only:数据对象里面封装了括号内查询的字段,直接点这个括号内字段属性不需要再次查询数据库
如果查询括号内没有的字段,每查询一次,就需要去数据库中重新查询,效率低
defer:数据库中封装了相当于除括号内查询的字段,直接点这个括号内字段属性需要再次查询数据库,如果查询括号内没有的字段,就不需要再次查询数据库,效率高
select_related 和 prefetch_related
select_related :
res = models.Book.objects.select_related('publish') # 支持放多个外键字段
print(res) # 查询外键字段,连表查询
for i in res:
print(i.publish.name) # 连表查询一次,一条sql语句
print(i.title) # 连表查询一次,一条sql语句
prefetch_related:
res = models.Book.objects.prefetch_related('publish') # 支持放多个外键字段
print(res) # 查询外键字段,子查询
for i in res:
print(i.publish.name) # 子查询查询一次,一条sql语句
print(i.title) # 子查询查询一次,一条sql语句
select_related 和 prefetch_related 的区别:
共同点:括号内只能放外键字段,并且外键字段关系只能是一对多、一对一,不能是多不多
不同点:
- select_related:内部是连表(left/right join)查询,查询的时候不需要再次查询数据库
- prefetc_related:内部是子查询,查询多张表,将查询结果封装到对象中,如果括号内外键字段比较多,则查询次数较多。
结合实际情况,哪种查询更加好?
select_related 查询需要连表,数据量大可能耗时比较久
prefetc_related 查询多张表,数据量大可能查询次数多一点,但是时间较快
ORM字段参数 choices
字段参数choices可以按照提前设计好的对应关系,存取对应真正的数据
models.py:
class User(models.Model):
user = models.CharField(max_length=64)
pwd = models.IntegerField()
gender_choices = (
(1,'男'),
(2,'女')
)
gender = models.IntegerField(choices=gender_choices)
手动插入数据:
id user pwd gender
1 qinyj 123 1
2 jack 123 2
from app01 import models
user_obj = models.User.objects.get(pk=1)
print(user_obj.get_gender_display())
只要是choices字段类型,在获取值的时候需要这样写:get_字段名_display()
Django之ORM查询优化的更多相关文章
- django之ORM的查询优化、Ajax 06
目录 ORM查询优化 only与defer select_related与prefetch_related查询优化 choices参数 MTV与MVC模型 Ajax简介 AJAX常见应用情景 AJAX ...
- orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax
目录 一.ORM查询优化 1. all()查询 2. only()/defer()方法 (1)only()方法 (2)defer()方法 3. select_related()/prefetch_re ...
- day09 orm查询优化相关
day09 orm查询优化相关 今日内容概要 orm字段相关补充 orm查询优化相关 orm事务操作 图书管理系统练习 今日内容详细 orm事务操作 """ 事务:ACI ...
- python——Django(ORM连表操作)
千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...
- Python’s SQLAlchemy vs Other ORMs[转发 3]Django's ORM
Django's ORM Django is a free and open source web application framework whose ORM is built tightly i ...
- 将SALT_STACK的JOB-CACHE放到数据库中,而建库用DJANGO的ORM完成
下面包括了SALT_MASTER的配置,及DJANGO的ORM里更改默认表名称,更改默认字段名称(里面有个RETURN),更改默认ID索引... 一个下午有和它磨来磨去... 感谢鹏龙,感谢高远..: ...
- Django:之ORM、CMS和二维码生成
Django ORM Django 的数据库接口非常好用,我们甚至不需要知道SQL语句如何书写,就可以轻松地查询,创建一些内容,所以有时候想,在其它的地方使用Django的 ORM呢?它有这么丰富的 ...
- Django的ORM实现数据库事务操作
在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费. 交易正常时,银行在消费者 ...
- 第十九章 Django的ORM映射机制
第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...
随机推荐
- shell得到两个文件的差集
第一种方法: grep: [root@hdp05 src]# grep -vxFf leadering.txt leaderNum.txt [root@hdp05 src]# cat leaderin ...
- kubeadm 安装k8s
环境要求: 机器名 ip地址 cpu和内存要求 kubernetes-master 10.0.0.11 2c2g(关闭swap) kubernetes-node1 10.0.0.12 2c2g(关闭s ...
- 完美解决 IE6 position:fixed 固定定位问题
关于 position:fixed; 属性 生成绝对定位的元素,相对于浏览器窗口进行定位. 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定. pos ...
- python 17 函数基础(一)
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- 面试39 MySQL读写分离
(1)如何实现mysql的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. (2)MySQL主从复制原 ...
- Java 基础 - 如何重写equals()
ref:https://www.cnblogs.com/TinyWalker/p/4834685.html -------------------- 编写equals方法的建议: 显示参数命名为oth ...
- scala中Map集合的简单使用
import scala.collection.mutable /** * Map集合的简单使用 */ object MapUse { def main(args: Array[String]): U ...
- python 九九乘法口诀
for i in range(1,10): for j in range(1,i+1): print(j,"*",i,"=",i*j,&qu ...
- thinkphp 多层mvc
hinkPHP基于MVC(Model-View-Controller,模型-视图-控制器)模式,并且均支持多层(multi-Layer)设计. 模型(Model)层 默认的模型层由Model类构成,但 ...
- Could not open file ..\obj\sys.o: No such file or directory解决办法
一.你的keil的安装路径以及系统用户名是否带中文字符以及一些特殊字符.二.环境变量的值存在中文或者特殊字符了,解决方法如下: 1.在C盘建立一个新的文件夹,命名为英文,如qcl2.右击"此 ...