ORM数据库查询优化only与defer(select_related与prefetch_related)

本文详细探讨了ORM语句的惰性查询特性,以及数据库查询优化方法only、defer、select_related和prefetch_related的使用。通过实例解释了它们的区别和应用场景:only用于限制返回对象的特定字段,defer则是排除指定字段。select_related进行INNER JOIN操作,一次性获取所有关联数据;而prefetch_related使用子查询,分步加载关联数据。理解并恰当运用这些方法能显著提升数据库查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录
  • 一:数据库查询优化
        • 1.ORM语句特点
        • 2.only
        • 3.defer
        • 4.only与defer区别
        • 5.select_related与prefetch_related
        • 6.select_related
        • 7.select_related概括
        • 8.prefetch_related
        • 9.prefetch_related概括
        • 10.select_related与prefetch_related区别

一:数据库查询优化

  • only与defer的数据查询优化

  • select_related与prefetch_related数据查询优化

1.ORM语句特点
惰性查询如果你仅仅只是书写了orm语句 在后面根本没有用到该语句所查询出来的参数那么orm会自动识别 直接不执行示例:res = models.Book.objects.all()print(res)  # 要用数据了才会走数据库
2.only
# 实现获取到的是一个书籍对象 然后点title就能够拿到书名 并且没有其他字段res = models.Book.objects.only('title')# res = models.Book.objects.all()for i in res:print(i.title)  # 点击only括号内的字段 不会走数据库# print(i.price)  # 点击only括号内没有的字段 会重新走数据库查询  # 而all不需要走数据库

image

3.defer
# 对象除了没有title属性之外 其他的都有,除了title走数据库,其他都不需要走数据库res = models.Book.objects.defer('title')for i in res:    print(i.title)
4.only与defer区别
defer与only刚好相反defer括号内的字段不在查询出来 广东干部培训 www.henanganxun.cn 的对象里面 查询该字段需要重新走数据而如果查询的是非括号内的时候 则不需要走数据库
# 拿到每一本书对应的出版社res = models.Book.objects.select_related('publish')  # INNER JOINfor i in res:print(i.publish.name)

image

7.select_related概括
1.select_related内部直接先将book与publish连接起来2.然后一次性将大表里面的所有数据全部封装给查询出来的对象3.这个时候对象无论是点击book表数据还是publish的数据都无需再走数据库查询了select_related括号内只能放外键字段  一对一  一对一多对多也不支持
res = models.Book.objects.prefetch_related('publish')  # 子查询for i in res:print(i.publish.name)
9.prefetch_related概括
prefetch_related该方法内部其实就是子查询将子查询查询出来的所有结果也给你封装到对象中给你的感觉好像也是一次性搞定的
10.select_related与prefetch_related区别
select_related:相当于是INNER JOIN 将两张表拼接起来!prefetch_related:相当于是 子查询 分布查询!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值