首页 > 解决方案 > Django:用另一个表中的字段注释(一对多)

问题描述

再会。我希望用来自不同表的信息来注释我的模型。

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=...)

- 我将子查询表达式放入其中而不是省略号。但是,我不确定如何匹配team_id变量。例如。

*.anotate(name=Subquery(Team.objects.filter(id=competitionteam.team_id)).values('name'))

相关的问题是:Django annotate field value from another model但我不确定在这种情况下如何实现它。在那种情况下,代替mymodel_id,我使用team_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."

标签: djangodjango-querysetmany-to-one

解决方案


我的问题的解决方案是:

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')))

谢谢。


推荐阅读