Django循环模型参考

2024-04-28 17:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始在一个小型的足球联赛管理网站上工作(主要是为了学习),我无法把自己的想法放在一个Django模特的关系上。为了简单起见,假设我有两种类型的对象-Player和Team。当然,一个玩家属于一个团队,所以这是玩家模型中的一个外键(团队)。 所以我说:

class Team(models.Model):
    name = models.CharField()
class Player(models.Model):
    name = models.CharField()
    team = models.ForeignKey(Team)

然后我希望每支球队都有一名队长,他将是其中的一名球员,这样他将成为球队模式中的一名外键(球员)。但这会产生循环依赖。 虽然我的Django经验有限,但这似乎是一个简单的问题,尽管我无法从概念上找出我做错了什么。


Tags: djangonamemodel网站models玩家团队team
3条回答

您可以在尚未定义的模型的外键中使用完整的应用程序标签,并使用相关的名称以避免名称冲突:

class Team(models.Model):
    captain = models.ForeignKey('myapp.Player', related_name="team_captain")

class Player(models.Model):
    team = models.ForeignKey(Team)

正如您在the docs中看到的,正是由于这个原因,可以将外部模型指定为字符串。

team = models.ForeignKey('Team')

这是解决这个问题的另一种方法。 我没有创建循环依赖项,而是创建了一个额外的表来存储玩家和团队之间的关系。最后看起来是这样的:

class Team(Model):
    name = CharField(max_length=50)

    def get_captain(self):
        return PlayerRole.objects.get(team=self).player

class Player(Model):
    first_name = CharField(max_length=50)
    last_name = CharField(max_length=50, blank=True)

    def get_team(self):
        return PlayerRole.objects.get(player=self).team

PLAYER_ROLES = (
    ("Regular", "Regular"),
    ("Captain", "Captain")
    )

class PlayerRole(Model):
    player = OneToOneField(Player, primary_key=True)
    team = ForeignKey(Team, null=True)
    role = CharField(max_length=20, choices=PLAYER_ROLES, default=PLAYER_ROLES[0][0])
    class Meta:
        unique_together = ("player", "team")

在存储方面,它可能比建议的解决方案效率稍低,但它避免了循环依赖性,并保持了数据库结构的干净和清晰。 欢迎评论。

相关问题 更多 >