我该如何设计Django模型用于团队、玩家和比赛对象?
我不太确定该怎么问这个问题?首先让我解释一下,我有两个模型,分别是 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
里。你不需要在 Player
或 Match
中重复这些数据,那样会造成数据冗余。相反,可以根据这些数据结构来计算比赛或球员的统计数据。