如何使用不需要引用特定内容的选项创建模型结构

问题描述

我的脑海中浮现出一个应该很简单的设计模式。我想从一群玩家中随机生成一个团队。每支球队需要一名教练、一名守门员和 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 位置属性链接到任何内容。这对我来说似乎很奇怪。

enter image description here

有没有办法制作一个模型结构,我可以问一个团队“谁是你的教练?”无需创建模型结构依赖于工作的内容?我实际上并不介意制作固定装置,它只是有一种代码气味。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)