Django循环模型参考

发布于 2021-01-29 19:10:07

我开始在一个小型的足球联赛管理网站上工作(主要是出于学习目的),我无法确定Django模型的关系。为简单起见,假设我有两种类型的对象-
玩家和团队。自然,一个玩家属于一个团队,因此在Player模型中就是一个ForeignKey(Team)。所以我去:

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

然后,我希望每个团队都有一个队长,该队长将是其中一名球员,因此在团队模型中将成为ForeignKey(Player)。但这会产生循环依赖。当然,我的Django经验有限,但这似乎是一个简单的问题,尽管我无法弄清楚我在概念上做错了什么。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是解决此问题的另一种方法。我没有创建循环依赖关系,而是创建了一个额外的表来存储球员和球队之间的关系。所以最终看起来像这样:

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

    就存储而言,它的效率可能比建议的解决方法略低,但是它避免了循环依赖,并保持了数据库结构的整洁。欢迎发表评论。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看