有什么方法可以加入 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>
我反复 运行 进入一种数据情况,我觉得 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>