例如,在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)
在这种情况下,C.objects.all().prefetch_related('z__b_set')
无法正常工作。
有没有办法预取我需要的信息c[0].z.b_set.all()
无需额外查询就可以使用?
答案 0 :(得分:4)
您可以使用select_related
一次性关注关系的第一部分(C.z
的{{1}}):
ForeignKey
然而,prefetch_related
部分至少会在两个查询中完成,如文档中所述:
另一方面,prefetch_related对每个关系进行单独查找,并在Python中进行“加入”。这允许它预取多对多和多对一对象,除了select_related支持的外键和一对一关系之外,这些对象无法使用select_related完成。它还支持预取GenericRelation和GenericForeignKey。
答案 1 :(得分:2)
您应该在B中明确设置related_name并迁移:
class B(models.Model):
y = models.ManyToManyField(A, related_name="bs")