来自外键的 Django prefetch_related 与 manytomanyfield 不起作用

Sem*_*Sem 4 python django postgresql

例如,在 Django 1.8 中:

class A(models.Model):
    x = models.BooleanField(default=True)

class B(models.Model):
    y = models.ManyToManyField(A)

class C(models.Model):
    z = models.ForeignKey(A)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,C.objects.all().prefetch_related('z__b_set')不起作用。

有没有办法在c[0].z.b_set.all()没有额外查询的情况下预取我需要的信息?

409*_*ict 7

您可以使用在一个批次中select_related跟踪关系的第一部分 ( C.z's ForeignKey):

C.objects.all().select_related('z').prefetch_related('z__b_set')
Run Code Online (Sandbox Code Playgroud)

prefetch_related但是,该部分将在至少两个查询中完成,如文档中所述:

另一方面,prefetch_related 对每个关系进行单独的查找,并在 Python 中进行“连接”。除了 select_related 支持的外键和一对一关系之外,这允许它预取使用 select_related 无法完成的多对多和多对一对象。它还支持 GenericRelation 和 GenericForeignKey 的预取。