Django,避免N + 1查询

时间:2017-01-28 13:12:18

标签: django django-models

我有三个模型在玩,并且想避免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)

1 个答案:

答案 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 - 您的模型与示例中的模型非常相似。