<p>好吧,我会被指责死亡,但也有MonkeyPatch技术(我喜欢和使用它,但可能导致可读性差),或者你可以做一个简单的捷径。</p>
<p>这里的猴子补丁,它的最好部分是,如果你有一个技能索引,你可以使用它:</p>
<pre><code>SKILLS = ["skill_1", "skill_2", "skill_3"]
for skill in SKILLS:
IntegerRangeField(
min_value=min_value, max_value=max_value
).contribute_to_class(MyModel, skill)
</code></pre>
<p>注意:它在迁移时很好地工作,同时将其保存在正确的应用程序模型文件中</p>
<p>以下是快捷方式:</p>
^{pr2}$
<p>希望它能帮上忙。</p>
<p>编辑:建议将重复的丑陋部分拆分,列出其他文件中所有字段,以便有新的可能性,在抽象类中隐藏大量不干法的代码(或拆分型号.py但这很难解释)。</p>
^{pr3}$
<p>然后在你的型号.py(2):</p>
^{pr4}$
<p>这里是关于抽象类的更多信息:<a href="https://docs.djangoproject.com/en/1.7/topics/db/models/#abstract-base-classes" rel="nofollow">https://docs.djangoproject.com/en/1.7/topics/db/models/#abstract-base-classes</a></p>
<p>或者,如果你是一个有趣的人,你可以把所有的东西都结合在一起:</p>
<p>此处为工具:</p>
<pre><code>def skill_fields(*skills):
class MyAbstractModel(models.Model):
class Meta:
abstract = True
for skill in skills:
new_skill().contribute_to_class(MyAbstractModel, skill)
return MyAbstractModel
</code></pre>
<p>这里的用法:</p>
<pre><code>from skills_utils import skill_fields
class Character(skill_fields("skill_1", "skill_2", *settings.MY_APP_SKILL_LIST)):
name = CharField(max_length=128)
</code></pre>
<p>但这最后一个是给那些只有最幽默的人;-)</p>
<p>如果我是你,如果你想拥有一些更大或更小范围的特殊技能,我会选择一种让你更开放的快捷方式,而且对于那些能在你之后接受项目的人来说,它更容易理解。</p>