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查询优化的更多相关文章

  1. django之ORM的查询优化、Ajax 06

    目录 ORM查询优化 only与defer select_related与prefetch_related查询优化 choices参数 MTV与MVC模型 Ajax简介 AJAX常见应用情景 AJAX ...

  2. orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax

    目录 一.ORM查询优化 1. all()查询 2. only()/defer()方法 (1)only()方法 (2)defer()方法 3. select_related()/prefetch_re ...

  3. day09 orm查询优化相关

    day09 orm查询优化相关 今日内容概要 orm字段相关补充 orm查询优化相关 orm事务操作 图书管理系统练习 今日内容详细 orm事务操作 """ 事务:ACI ...

  4. python——Django(ORM连表操作)

    千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...

  5. 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 ...

  6. 将SALT_STACK的JOB-CACHE放到数据库中,而建库用DJANGO的ORM完成

    下面包括了SALT_MASTER的配置,及DJANGO的ORM里更改默认表名称,更改默认字段名称(里面有个RETURN),更改默认ID索引... 一个下午有和它磨来磨去... 感谢鹏龙,感谢高远..: ...

  7. Django:之ORM、CMS和二维码生成

    Django ORM Django 的数据库接口非常好用,我们甚至不需要知道SQL语句如何书写,就可以轻松地查询,创建一些内容,所以有时候想,在其它的地方使用Django的 ORM呢?它有这么丰富的 ...

  8. Django的ORM实现数据库事务操作

    在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费. 交易正常时,银行在消费者 ...

  9. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

随机推荐

  1. centos 根目录扩容

    添加一块磁盘 参考上一篇博文VMware Workstation 添加磁盘 挂载目录(centos) 查看当前磁盘挂载情况 [root@node1 ~]# fdisk -l Disk /dev/sda ...

  2. k8s 映射 外部服务

    把外部的服务,通过创建service和endpoint,把它映射到k8s内部来使用. 操作步骤: 在10.0.0.13上安装数据库 yum install mariadb-server -y syst ...

  3. 天道神诀---DHCP服务(上篇)

    DHCP DHCP(Dynamic Host Configuration Protocol, 动态主机配置协议),被应用在局域网环境中,主要作用是集中的管理.分配IP地址,使网路环境中的主机动态的获得 ...

  4. uoj#209【UER #6】票数统计

    题目 做UER的A题涨信心 首先我们注意到这个所谓的至少有一条正确在\(x\)和\(y\)不相等的时候非常弱,当\(x<y\)时,只有可能是后\(y\)位用户有\(x\)个通过:当\(x> ...

  5. StringBuilder 和 StringBuffer类

    通常在涉及到StringBuilder和StringBuffer时中任何一个时,都应该想到另外一个并且在脑海中问自己是否用另外一个更加合适. 为什么这么说,请继续往下看,当然如果你已经对二者烂熟于胸自 ...

  6. Producer-Consumer 生产者,消费者

    这个模式跟Guarded模式有点类似,不过需要一个控制台限制请求方和处理方的频度和数量. public class ProducerConsumerTest { /** * @param args * ...

  7. iOS开发系列-Lock

    概述 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. iOS中锁之前的性能的图标排行: ...

  8. 神经网络 (1)- Alexnet

    文章目录 模型结构 conv1层 conv2层 conv3层 conv4层 conv5层 FC6全链接图: fc7全连接层:和fc6类似. fc8链接层: 模型优化 选择ReLU作为激活函数 多GPU ...

  9. redis笔记_源码_双端链表list

    参考:https://redissrc.readthedocs.io/en/latest/datastruct/adlist.html

  10. leetcood学习笔记-55-跳跃游戏

    题目描述: 第一次提交: class Solution: def canJump(self, nums: List[int]) -> bool: if len(nums)<=1: retu ...