我需要创建一个包含15个相似字段的模型(让我们称之为field_01
,field_02
,field_03
等。我还需要这些字段易于使用(例如,能够执行obj.field_01
之类的操作)。因为我想快速得到一些东西,我只是以愚蠢的方式创造它们:
class M (models.Model):
....
field_01 = models.NullBooleanField()
field_02 = models.NullBooleanField()
....
我在网上搜索了更好的方法。有人说使用 setattr
,但据我所知,从阅读和尝试一些东西,这会将属性添加到类的实例,而不是类本身,这意味着当我尝试将模型表单附加到此模型时,它将不会看到添加了setattr
的字段。然后我尝试重写 __new__
函数,这将允许我在创建该类的实例之前向类添加属性。但我无法弄清楚如何做到这一点。
那么,在没有破坏南方和模型表格而没有复制粘贴的情况下,生成这些字段的方法是什么?
答案 0 :(得分:3)
如果没有一个具体的例子表明你的行为很难说明确,但一般来说,如果你发现自己重复某个领域,那么它就是一对多或多对多关系的明确标志,而是:
<强> 1对许多强>
class Field(models.Model):
m = models.ForeignKey(M, related_name='fields')
field = models.NullBooleanField()
<强>许多对多强>
class Field(models.Model):
field = models.NullBooleanField()
class M(models.Model):
fields = models.ManyToManyField(Field)
答案 1 :(得分:1)
Django模型有一个add_to_class
方法,你可以按照你想要的方式(ab)用于猴子修补模型。
for i in range(1, 10):
M.add_to_class('field_%s' % s, NullBooleanField())
答案 2 :(得分:0)
听起来你正在寻找一个EAV风格的数据库。您应该尝试使用库而不是自己编辑库。为此,Django EAV看起来非常棒。 https://github.com/mvpdev/django-eav
要详细了解一堆图书馆的优缺点,请完成此检查:https://stackoverflow.com/a/7934577/884453