我有三个模型在玩,并且想避免N + 1查询。
class Rule(models.Model):
pass
class RuleConstraint(models.Model):
rules = models.ManyToManyField(Rule)
class Foo(models.Model):
rule = models.ForeignKey(Rule, related_name='foos')
对于给定的foo,我可以获得相关的RuleConstraints,如下所示
RuleContraint.objects.filter(rules__foos=foo)
问题是,当我有foos
而不是单个foo时,如何避免N + 1查询症状。
即,有没有比
更好的方法for foo in foos:
rule_constraints = RuleConstraint.objects.filter(rules__foos=foo)
答案 0 :(得分:1)
您想要prefetch_related
foos = Foo.objects.prefetch_related('rule__rule_constraint')
然后,您可以使用以下命令遍历查询集:
for foo in foos:
rule_constraints = foo.rule.ruleconstraint_set.all()
您可以使用select_related
来获取rule
。
foos = Foo.objects.select_related('rule').prefetch_related('rule__rule_constraint')
有关详细信息,请参阅the prefetch related docs - 您的模型与示例中的模型非常相似。