玩家的Django模型

时间:2016-03-08 03:25:15

标签: python django

我正在开发一个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)

一名玩家可以进行多场比赛,一场比赛可以包含多名玩家,这就是为什么我有点困惑。

4 个答案:

答案 0 :(得分:0)

您应该只在其中一个模型中定义关系,因此第二个示例是正确的。

在第一个(顺便说一下,你有一个错字应该是Matches)你在这两个模型之间创建两个单独的M2M关系,你不希望在你的情况下。

在不相关的说明中,需要player_idmatch_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
相关问题