我反复遇到一个数据情况,我觉得django可能有一个快捷方式,但我找不到它…
我想访问通过related_name选择的查询集之外的模型1关系。感觉应该有一个单行代码,但我认为最好的是:
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
s的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(players__team=team)
这将检索所有有Player
对象引用team
的User
。如果一个User
可以多次成为团队的一部分,你可以使用 .distinct()
[Django-doc]每个User
最多检索一次:
User.objects.filter(players__team=team).distinct()