虽然将同一模型引用两次没有问题,但也许有更好的方法来解决这个特定的问题。
在Team
模型中添加一个布尔值,以标识球员+团队组合是否为队长:
class Team(models.Model):
player = models.ForeignKey(Player)
name = models.CharField(max_length=50)
is_captain = models.BooleanField(default=False)
查找团队的队长:
Team.objects.filter(is_captain=True)
个人而言,我不喜欢这种方法,因为搜索语义不合理(即,“团队”不是“队长”)。
另一种方法是识别每个球员的位置:
class Player(models.Model):
name = models.CharField(max_length=50)
position = models.IntegerField(choices=((1,'Captain'),(2,'Goal Keeper'))
jersey = models.IntegerField()
def is_captain(self):
return self.position == 1
class Team(models.Model):
name = models.CharField(max_length=50)
player = models.ForeignKey(Player)
def get_captain(self):
return self.player if self.player.position == 1 else None
当你搜索时,这会更有意义:
Player.objects.filter(position=1)
(返回所有队长)
Team.objects.get(pk=1).get_captain()
(返回该团队的队长)
无论哪种情况,但是您必须进行一些预保存检查,以确保特定位置只有一个球员。
class Team(models.Model): name = models.CharField(max_length=50, unique=True) captain = models.ForeignKey('Player', related_name='captain') class Player(models.Model): name = models.CharField(max_length=50) team = models.ForeignKey(Team)
但是这会生成不同的SQL表。"team"表有"captain_id" integer NOT NULL
,而"player"表有"team_id" integer NOT NULL REFERENCES "tm_team" ("id")
。因此,似乎指定外键模型为字符串会产生不同的结果。 - exfizik