来自foreignkey的Django prefetch_related,manytomanyfield无效

时间:2015-07-30 08:57:50

标签: 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)

在这种情况下,C.objects.all().prefetch_related('z__b_set')无法正常工作。

有没有办法预取我需要的信息c[0].z.b_set.all()无需额外查询就可以使用?

2 个答案:

答案 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")