【发布时间】:2020-11-17 06:29:57
【问题描述】:
美好的一天。 我希望使用来自不同表的信息来注释我的模型。
class CompetitionTeam(models.Model):
competition_id = models.ForeignKey('Competition', on_delete=models.CASCADE, to_field='id', db_column='competition_id')
team_id = models.ForeignKey('Team', on_delete=models.CASCADE, to_field='id', null=True, db_column='team_id')
...
class Team(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
teamleader_id = models.ForeignKey('User', on_delete=models.CASCADE, to_field='id', db_column='teamleader_id')
...
class Competition(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
...
循环浏览我的比赛,我希望检索要显示的比赛团队对象列表以及相关团队的名称。我试过了:
CompetitionTeam.objects.filter(competition_id=_competition.id).filter(team_id__in=joined_team_ids).annotate(name=...)
-where 而不是我放入子查询表达式的省略号。但是,我不确定如何匹配 team_id 变量。例如。
*.anotate(name=Subquery(Team.objects.filter(id=competitionteam.team_id)).values('name'))
相关的是问题:Django annotate field value from another model 但我不确定在这种情况下如何实现。在那种情况下,我使用team_id 代替mymodel_id,但它只有来自Team 对象的参数,而不是我的竞赛团队对象。我不太了解OuterRef,但这是我失败的尝试:
CompetitionTeam.objects.filter(competition_id=_competition.id).filter(team_id__in=joined_team_ids).annotate(name=Subquery(Team.objects.get(id=OuterRef('team_id'))))
"Error: This queryset contains a reference to an outer query and may only be used in a subquery."
【问题讨论】:
-
我刚试过:
CompetitionTeam.objects.filter(competition_id=_competition.id).filter(team_id__in=joined_team_ids).annotate(name=Subquery(Team.objects.filter(id=OuterRef('team_id')).values('name'))),它似乎工作。我实际上不知道为什么......我现在想知道是否可以简化我的逻辑:我希望检索所有比赛,每个比赛所附的比赛队并注释各自的队名。 -
注释中的代码有效,因为它返回一个 QuerySet,
.get不允许引用外部查询 (OuterRef)。如果您觉得有新内容,请编辑您的问题,而不是发表评论。 -
@Alvi15 我现在要删除我的问题吗?或者只是接受我的回答。我不想添加任何新内容。
-
我相信,如果您在
Team模型中放置一个引用Competetion模型的 M2M 字段,那么事情看起来会容易得多,您可以在没有内部子查询的情况下进行查询。在 M2M、121、M21、12M 的情况下,Django 会自动为您创建关系表。子查询方式似乎效率不高。 -
对于我的竞赛团队模型,我存储了有关 c-t 对的附加信息,例如加入日期。我想问一下 M2M 领域是否能够捕捉到这一点?感谢您的评论。
标签: django django-queryset many-to-one