Django 链接 prefetch_related 和 select_related

Pav*_*mar 5 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, ...)
Run Code Online (Sandbox Code Playgroud)

现在我想进行以下查询。

foos = Foo.objects.prefetch_related('bars__prop').all()
Run Code Online (Sandbox Code Playgroud)

确实上述查询使得3级数据库的呼叫或仅2(select_related用于propbar),因为只有一个prop与之相关联bar

如果需要 3 次调用,有没有办法通过使用 selected_related for bar -> prop

Ber*_*ant 6

您可以使用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()
Run Code Online (Sandbox Code Playgroud)

请注意,这应该是两个查询,一个用于Foo对象,另一个用于获取Bar使用Prop.