问题描述
我的脑海中浮现出一个应该很简单的设计模式。我想从一群玩家中随机生成一个团队。每支球队需要一名教练、一名守门员和 3-5 名球员。每个玩家只有一种类型。例如,简总是教练。杰克始终是一名守门员。
我遇到的问题是我看不到一种创建模型结构的方法,该结构不依赖于引用数据库中存在的某些内容实例。
我可以制作如下所示的类布局,其中位置通过选择明确:
class Position(models.Model):
title = models.CharField(choices=["Coach","Goalie","Team Member"])
min_players = models.IntegerField()
max_players = models.IntegerField()
class Player(models.Model):
name = models.CharField()
position = models.ForeignKey(Position)
class Team(models.Model):
roster = models.OnetoManyField(Player)
我不喜欢那样,因为我想问一个团队:你的教练是谁?谁是你的守门员?
我能想到的两种方法是确保(通过装置、初始化脚本、手动数据输入等等)只有三个 Position 实例。一个人的头衔是“教练”,一个人的头衔是“守门员”。然后在 Team 上为 get_coach 和 get_goalie 添加方法,执行如下查询:
def get_coach(self):
return self.roster.objects.get(position="Coach")
这是在代码中加入关于内容的假设,这对我来说似乎很奇怪,但还可以,因为不会有一个灵活的位置选择列表。你不能进去添加“右翼”作为位置选择。职位列表是一成不变的。
我能想到的另一种方法是子类化:
class Position(models.Model):
title = models.CharField()
min_players = models.IntegerField()
max_players = models.IntegerField()
class Coach(Position):
title = "Coach"
min_players = 1
max_players = 1
class Goalie(Position):
title = "Goalie"
min_players = 1
max_players = 1
class TeamMember(Position):
title = "Team Member"
min_players = 3
max_players = 5
class Player(models.Model):
name = models.CharField()
position = models.ForeignKey(...)
# --anything that is a subclass of Position?
class Team(models.Model):
coach = models.OnetoOneField(...)
# Player instance where the model of the linked Position = Coach?
goalie = models.OnetoOneField(...)
# Player instance where the model of the linked Position = Goalie?
我喜欢这个是因为它在代码中明确指出只有三种玩家类型,而且我知道它们是什么。教练。守门员。队员。但同样,我需要创建内容,位置的每个子类之一,以便为 Player 位置属性链接到任何内容。这对我来说似乎很奇怪。
有没有办法制作一个模型结构,我可以问一个团队“谁是你的教练?”无需创建模型结构依赖于工作的内容?我实际上并不介意制作固定装置,它只是有一种代码气味。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)