Skip to main content
 首页 » 编程设计

python之在 Django 中指定一组相关字段时公认的最佳实践是什么

2025年05月04日18bjzhanghao

假设我在 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。