Django链prefetch_related和select_related

时间:2019-02-07 08:45:30

标签: django django-models prefetch

假设我有以下型号

class Foo(models.Model):
    ...

class Prop(models.Model):
    ...

class Bar(models.Model):
    foo: models.ForeignKey(Foo, related_name='bars', ...)
    prop: models.ForeignKey(Prop, ...)

现在我要进行以下查询。

foos = Foo.objects.prefetch_related('bars__prop').all()

假设只有一个propbar相关联,上述查询是否进行3次数据库调用或仅进行2次(与propbar的select_related)

如果需要接听3个电话,是否可以通过对bar -> prop使用selected_related来使其接听2个电话

1 个答案:

答案 0 :(得分:0)

您可以使用Prefetch类来指定prefetch_related()中使用的查询集,并将其与select_related()结合使用:

from django.db.models import Prefetch
bars = Bar.objects.select_related('prop')
foos = Foo.objects.prefetch_related(Prefetch('bars', queryset=bars)).all()

请注意,这应该是两个查询,一个用于Foo对象,一个用于获取相关的Bar对象,这些对象在同一查询中使用Prop进行连接。