django - 在预取相关模型中,Django 可以选择相关的字段?

  显示原文与译文双语对照的内容
0 0

假设为simplcity的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')
时间:原作者:4个回答

0 0

你只需要一个 prefetch_related 调用:

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

这将prefetch两张表。

原作者:
0 0

这里答案 1.7之前的Django 版本正确。 它产生3 个查询:首先获取 A的实例,然后获取它的相关的B 实例,最后获取与第二个查询中提取的B 相关的C 实例。

在 Django 1.7之前,这是最好的方法,尽管第二个查询可以在理论上选择所有 B 对象以及通过 zForeignKey 连接的相关 C 对象。

从 Django 1.7开始,有一个更高级的Prefetch 类,它允许你。 使用 Prefetch,你可以定制用于预抓取相关对象的queryset:

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

这只会导致两个查询( 与使用 prefetch_related('a__z') 时相反),并让数据库处理第二个连接,这会导致性能略有提高。

原作者:
...