我该如何设计Django模型用于团队、玩家和比赛对象?

2 投票
2 回答
1675 浏览
提问于 2025-04-17 17:59

我不太确定该怎么问这个问题?首先让我解释一下,我有两个模型,分别是 Team(团队)和 Player(玩家)。

class team()
        name = models.CharField(max_length=100) // name quato something like this

class player(models.Model) 
        point = models.IntegerField()
        assist = models.IntegerField() 
        rebound = models.IntegerField() //something like this 
        team = models.ForeignKey(team)

我需要一个 Match(比赛)模型,以及在这场比赛中玩家的表现(得分、助攻、篮板);我该怎么创建一个模型来表示这些呢?

2 个回答

1

我会这样做:

class StatisticsBase(models.Model):
    class Meta:
        abstract = True

    points = models.IntegerField()   # plural form reads easier here
    assists = models.IntegerField()  # at least in English
    rebounds = models.IntegerField()


class Player(StatisticsBase):
    name = models.CharField(max_length=100)


class Match(StatisticsBase):
    players = models.ManyToManyField(Player)  # you should capitalize class names
    # any additional fields
2

这是一个练习或者作业吗?还是在模拟一个真实的应用场景?比如说,球员可能会随着时间换队,那你打算怎么建模呢?为了简单起见,我们假设球员不会换队。我的建模方式如下:

class Team(models.Model):
    name = models.CharField(max_length=100)
    # other attributes that do not change over time

class Player(models.Model):
    name = models.CharField(max_length=100)
    team = models.ForeignKey(Team)
    # other attributes that do not change over time

class Match(models.Model):
    venue = models.CharField(max_length=100)
    date = models.DateField()
    # other non-redundant attributes

class PlayerMatch(models.Model):
    player = models.ForeignKey(Player)
    match = models.ForeignKey(Match)

    points = models.IntegerField()
    assists = models.IntegerField()
    rebounds = models.IntegerField()

这里重要的是,统计数据只保存在 PlayerMatch 里。你不需要在 PlayerMatch 中重复这些数据,那样会造成数据冗余。相反,可以根据这些数据结构来计算比赛或球员的统计数据。

撰写回答