繁体   English   中英

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

[英]Django prefetch_related from foreignkey with manytomanyfield not working

例如,在 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()无需额外查询即可工作?

您可以使用select_related批量跟踪关系的第一部分( CzForeignKey ):

C.objects.all().select_related('z').prefetch_related('z__b_set')

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

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

您应该在 B 中显式设置 related_name 并迁移:

class B(models.Model):
    y = models.ManyToManyField(A, related_name="bs")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM