django- 在另一个 prefetch_related 中使用 prefetch_related

Posted

技术标签:

【中文标题】django- 在另一个 prefetch_related 中使用 prefetch_related【英文标题】:django- Use prefetch_related inside of another prefetch_related 【发布时间】:2016-11-28 23:48:15 【问题描述】:

可以找到最接近我所要求的内容 here

假设我有以下模型:

class Division(models.Model):
    name = models.TextField()
    state = models.IntegerField()

class Team(models.Model):
    name2 = models.TextField()
    division = models.ForeignKey(Division, ...)

class Player(models.Model):
    name = models.TextField()
    hometown = models.IntegerField()
    team = models.ForeignKey(Team, ...)

现在我已经可以为一张表执行以下操作了:

players = Player.objects.prefetch_related('team')

如何将state 添加到查询集中?我的最终目标是能够在模板内执行player.team.division.state。另一种选择是使用嵌套的 for 循环,但我想避免这种情况。

【问题讨论】:

您的示例模型很难理解,因为它们的名称和字段非常相似。从另一个模型到model3没有外键/多对多字段,所以这里没有理由使用prefetch_related。一个简单的select_related 就可以了。 @Alasdair 请看看我的编辑 【参考方案1】:

这里不需要prefetch_related。您可以使用select_related() 跟踪从PlayerTeamDivision 的外键。

players = Player.objects.select_related('team__division')

prefetch_related 的用例是,如果您从 Division 查询集开始,并希望同时获取相关团队。

【讨论】:

不确定这是否应该是一个不同的问题,但是:即使球队没有球员,我如何将球队和球员放在一个查询集中? 这是一个单独的问题。在您提出新问题之前,请查看prefetch related docs。示例模型与您的非常相似。您可以使用与团队之间的反向外键相关的预取,就像他们将其用于多对多字段一样。 我发现prefetch objects documentation 也非常有用。

以上是关于django- 在另一个 prefetch_related 中使用 prefetch_related的主要内容,如果未能解决你的问题,请参考以下文章

Django:prefetch_related() 是不是遵循反向关系查找?

Django:prefetch_related 没有效果

Django prefetch_related 一个大型数据集

使用 prefetch_related 优化 Django Queryset 多对多 for 循环

Django:4个表中的select_related() / prefetch_related()

prefetch_related 上的 Django ORM 注释