假设我在 Django 中为一个角色扮演游戏创建一个“角色”模型,我希望所有属性(力量、敏捷、耐力等)都以类似的方式定义,并且能够以类似的方式处理方式。
显然我可以这样做:
intelligence = IntegerRangeField(min_value=1, max_value=10)
wits= IntegerRangeField(min_value=1, max_value=10)
resolve = IntegerRangeField(min_value=1, max_value=10)
strength = IntegerRangeField(min_value=1, max_value=10)
dexterity = IntegerRangeField(min_value=1, max_value=10)
stamina = IntegerRangeField(min_value=1, max_value=10)
presence = IntegerRangeField(min_value=1, max_value=10)
manipulation = IntegerRangeField(min_value=1, max_value=10)
composure = IntegerRangeField(min_value=1, max_value=10)
整数范围字段 definition
但这并不是特别的DRY .这也意味着当我添加大约 30 种相似的技能时,我将变得更加干练,并且容易出错。
这些似乎不值得通过外键创建(这是解决方案 here ),因为我需要为每个属性等指定 9 个。
是否已经有 DRY 解决方案?还是我需要自己动手?
编辑:
我对属性和技能的主要用途是为技能检查提供总数,例如,如果我想知道为编程掷多少骰子,我可能会指定它使用字符intelligence+computers 属性和技能,例如来自“任务”列表(例如属性和技能的其他组合)显示该角色可以执行的前五项。
编辑:
看起来遵循 M2M 路线导致我过度规范化。谁能suggest improvements ?
请您参考如下方法:
对于需要重复字段的这种情况(如@RonaldOldenburger 建议),您可以使用多对多字段关系。例如:
class Skill(models.Model):
name = models.CharField(max_length=255)
value = IntegerRangeField(min_value=1, max_value=10)
class Character(models.Model):
name = models.CharField(max_length=255)
skill = models.ManyToManyField(Skill)
如果您使用 modelform 创建一个 Character 模型实例,那么您可以使用 model formset factory向其添加 Skill。
