Django循环模型参考 [英] Django circular model reference
问题描述
所以我去:
class Team(models.Model):
name = models.CharField )
class Player(models.Model):
name = models.CharField()
team = models.ForeignKey(Team)
然后,我希望每个队伍都有一个队长,这将是球队的一个球员,所以在Team模型中将是一个ForeignKey(Player)。但这将创造一个循环依赖。
授予我的Django经验是有限的,但它似乎是一个简单的问题,虽然我无法弄清楚我在概念上做错了什么。
这是解决这个问题的另一种方法。
我创建了一个额外的表来存储玩家和团队之间的关系,而不是创建循环依赖。所以最终看起来像这样:
class Team(Model):
/ pre>
name = CharField(max_length = 50 )
def get_captain(self):
返回PlayerRole.objects.get(team = self).player
类玩家(模型):
first_name = CharField(max_length = 50)
last_name = CharField(max_length = 50,blank = True)
def get_team(self):
返回PlayerRole.objects.get = b
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)
在存储方面的效率可能略低于建议的解决方法,但它避免了循环微小的依赖性,并保持数据库结构的清晰和清晰。
欢迎评论。I'm starting to work on a small soccer league management website (mostly for learning purposes) and can't wrap my mind around a Django models relationship. For simplicity, let's say I have 2 types of objects - Player and Team. Naturally, a player belongs to one team so that's a ForeignKey(Team) in the Player model. So I go:
class Team(models.Model): name = models.CharField() class Player(models.Model): name = models.CharField() team = models.ForeignKey(Team)
Then I want each team to have a captain which would be one of the players so that would be a ForeignKey(Player) in the Team model. But that would create a circular dependency. Granted my Django experience is limited, but it seems like a simple problem, though I can't figure out what I'm doing wrong conceptually.
解决方案Here is another way to tackle this problem. Instead of creating a circular dependency, I created an additional table that stores the relationship between players and teams. So in the end it looks like this:
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")
It might be slightly less efficient in terms of storage than the suggested workaround, but it avoids the circular dependency and keeps the DB structure clean and clear. Comments are welcome.
这篇关于Django循环模型参考的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!