我正在开发一个django网站,可以让我显示有关游戏的玩家和比赛的一些信息。
将有多个比赛和多个球员。我遇到的问题是我不确定这是不是我应该做的事情:
class Player(models.Model):
player_id = models.IntegerField(default=0)
matches = models.ManyToMany(Match)
class Matches(models.Model):
match_id = models.IntegerField(default=0)
players = models.ManyToMany(Player)
或者我应该这样做:
class Player(models.Model):
player_id = models.IntegerField(default=0)
class Matches(models.Model):
match_id = models.IntegerField(default=0)
players = models.ManyToMany(Player)
一名玩家可以进行多场比赛,一场比赛可以包含多名玩家,这就是为什么我有点困惑。
答案 0 :(得分:0)
您应该只在其中一个模型中定义关系,因此第二个示例是正确的。
在第一个(顺便说一下,你有一个错字应该是Matches
)你在这两个模型之间创建两个单独的M2M关系,你不希望在你的情况下。
在不相关的说明中,不需要player_id
和match_id
列,因为Django会自动为您的模型创建id
列。
答案 1 :(得分:0)
你必须使用ManyToManyField,你只能将它添加到一个模型中:
class Player(models.Model):
player_id = models.IntegerField(default=0)
matches = models.ManyToMany(Match)
class Matches(models.Model):
match_id = models.IntegerField(default=0)
声明模型后,Player对象可以通过下一种方式访问相关的Matches对象:
player.matches.all()
匹配对象可以通过下一种方式访问相关的Player对象:
match.player_set.all()
参见文章Many-to-many relationships, Django documentation,有很多关于如何在Django中拨打ManyToMany关系的完整信息。
答案 2 :(得分:0)
以下代码将解决您项目的模型结构。
class TimeStamped(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Player(TimeStamped):
name = models.CharField(max_length=50)
extra_info = models.TextField()
matches = models.ManyToManyField('Match')
def __unicode__(self):
return self.name
class Match(TimeStamped):
title = models.CharField(max_length=50)
extra_info = models.TextField()
class Meta:
verbose_name_plural = 'Matches'
def __unicode__(self):
return self.title
TimeStamped
模型对于您构建的每个项目都是一个好主意。如果您使用的是Python 3,请将__unicode__
替换为__str__
。不要在模型名称中使用复数。使用verbose_name_plural
,这是我认为的惯例。您可能会遇到来自Match
实例的查询播放器的问题。阅读文档以获取详细信息。如果你在这里找不到那篇文章。由于这篇文章与查询集无关,所以我跳过了那一部分。
答案 3 :(得分:0)
绝对适合这种情况,需要在DB中设置ManyToMany关系。
如果您没有提供任何其他主键,id是Django模型中的默认字段。 ID是增量的。根据我的观点,以下模型足以满足您的情况。
class Player(models.Model):
name = models.CharField(max_length=255)
class Match(modles.Model):
player = models.ManyToMany(Player, related_name="matches")
根据上面的模型示例,您可以访问一个玩家和玩过一场比赛的玩家的比赛。
match = Match.objects.get(id=1)
print match.player.all() # It will print all players for match of id 1
player = Player.objects.get(id=1)
print player.matches