有什么方法可以加入 related_name 之后的一级吗?

Is there any method to join one level past a related_name?

我反复 运行 进入一种数据情况,我觉得 django 可能有一个快捷方式,但我找不到它...

我想访问我通过 related_name 选择的查询集之外的模型一关系。感觉应该有一条线,但我想出的最好的是:

for p in team.players:
   do_whatever(p.user.email)

使用 select_related 将预缓存数据,但实际上不会以可用的形式将其提供给我。

team.players.select_related('user')  # still returns queryset of Players, not Users

似乎应该有某种方法可以让我通过一个电话获得关联的 user 的 query_set。类似于 annotate:

users = team.players.annotate('user')   # doesn't work

有什么方法可以满足我的要求吗?或者“for - in”循环是唯一的方法吗?

我的基础 类(大大简化):

class Team(models.Model):
   name = models.CharField()

class Player(models.Model):
   team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="players")
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="players")
   captain = models.BooleanField()

除了执行 select_related 后跟 for-in 之外,是否有任何单行或优化?

您可以 .filter(…) [Django-doc] 使用:

User.objects.filter(<b>players__team=<i>team</i></b>)

这将检索所有 User,其中有一个 Player 对象引用 team。如果 User 可以多次成为团队的一部分,您可以使用 .distinct() [Django-doc] 最多检索每个 User 一次:

User.objects.filter(<b>players__team=<i>team</i></b>)<b>.distinct()</b>