Django 链接 prefetch_related 和 select_related

标签 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()

鉴于只有一个 prop,上述查询是进行 3 次数据库调用还是仅进行 2 次(select_related for bar from prop)与 bar 相关联

如果需要 3 次调用,有没有办法通过对 bar -> prop 使用 selected_related 来实现 2 次调用

最佳答案

您可以使用 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 加入同一查询的对象.

关于Django 链接 prefetch_related 和 select_related,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54569384/

相关文章:

json - Django - 没有明确请求的 d3.js 通信?

python - 如何检查列表中的当前用户是否投票了某个帖子

python - Django 中 isinstance() arg 2 必须是类型或类型元组错误

django - 如何在 Django 中创建一个 numpy 数组字段?

x86-64 - 预取写入是否会影响单核性能?

Django 在数据库保存时转换日期时间

python - Django ORM : filter related objects?

Django prefetch_related - 使用来自不同表的 or 子句过滤

python - 在 django_simple_history 中使用 prefetch_related

python - 持久后台任务 Django + Heroku