栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django ORM中的select_related和prefetch_related有什么区别?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django ORM中的select_related和prefetch_related有什么区别?

您的理解基本上是正确的。您可以使用

select_related
时,你将要选择的对象是一个对象,所以
OneToOneField
还是
ForeignKey
。您可以使用
prefetch_related
时,你会得到一个东西的“设置”,所以
ManyToManyField
S作为你陈述或反向
ForeignKey
秒。为了阐明我的意思是“
reverse
ForeignKey
s”,这里有一个例子:

class ModelA(models.Model):    passclass ModelB(models.Model):    a = ForeignKey(ModelA)ModelB.objects.select_related('a').all() # Forward ForeignKey relationshipModelA.objects.prefetch_related('modelb_set').all() # Reverse ForeignKey relationship

区别在于

select_related
执行SQL连接,因此从SQL
Server将结果作为表的一部分返回。
prefetch_related
另一方面,执行另一个查询,因此减少了原始对象中的冗余列(
ModelA
在上面的示例中)。您可以使用
prefetch_related
任何可以使用的东西
select_related

需要权衡的是

prefetch_related
必须创建并发送ID列表以选择回服务器,这可能需要一段时间。我不确定在事务中是否有很好的方法,但是我的理解是Django总是只发送一个列表并显示SELECT
… WHERe PK
IN(…,…,…)基本上。在这种情况下,如果预取的数据稀疏(例如,将美国国家对象链接到人们的地址),这可能会很好,但是,如果它们之间的关系更接近一对一,则会浪费大量通信资源。如有疑问,请尝试两者并查看效果更好。

上面讨论的所有内容基本上都与与数据库的通信有关。但是,在Python方面

prefetch_related
具有额外的好处,即使用单个对象表示数据库中的每个对象。使用
select_related
重复的对象将在Python中为每个“父”对象创建。由于Python中的对象具有相当大的内存开销,因此这也是一个考虑因素。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/653196.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号