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()
跟踪从Player
到Team
到Division
的外键。
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 一个大型数据集
使用 prefetch_related 优化 Django Queryset 多对多 for 循环