gpt4 book ai didi

django 我们可以在预取相关模型上选择相关字段吗?

转载 作者:行者123 更新时间:2023-11-28 19:35:27 25 4
gpt4 key购买 nike

为了简单起见,假设这些是 django 模型:

class A():

a = manytomany('B')

class B():

b = charfield()
z = foreignkey('C')

class C():

c = charfield()

我们可以做这样的事情来获取 z 吗:

foo = A.objects.get(pk = 1).prefetch_related('a').select_related('a__z')

最佳答案

This answer对于 1.7 之前的 Django 版本是正确的。它产生三个查询:首先,获取 A 的实例,然后获取其相关的 B 实例,最后获取与 C 相关的实例在第二个查询中获取的 B

在 Django 1.7 之前,这是你能做的最好的,即使第二个查询理论上可以选择所有 B 对象以及相关的 C 对象通过 z ForeignKey

从 Django 1.7 开始,有一个更高级的 django.db.models.Prefetch允许你这样做的类。使用 Prefetch,您可以自定义用于预取相关对象的查询集,如下所示:

foo = A.objects.prefetch_related(
Prefetch('a', queryset=B.objects.select_related('z'))
).get(pk=1)

这只会产生两个查询(与使用 prefetch_related('a__z') 时的三个查询相反)并让数据库处理第二个连接,理论上这应该会带来更好的性能.

关于django 我们可以在预取相关模型上选择相关字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13973422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com