django模型中的重复字段

时间:2012-08-10 17:27:29

标签: django model field

我需要创建一个包含15个相似字段的模型(让我们称之为field_01field_02field_03等。我还需要这些字段易于使用(例如,能够执行obj.field_01之类的操作)。因为我想快速得到一些东西,我只是以愚蠢的方式创造它们:

class M (models.Model):
    ....
    field_01 = models.NullBooleanField()
    field_02 = models.NullBooleanField()
    ....

我在网上搜索了更好的方法。有人说使用 setattr ,但据我所知,从阅读和尝试一些东西,这会将属性添加到类的实例,而不是类本身,这意味着当我尝试将模型表单附加到此模型时,它将不会看到添加了setattr的字段。然后我尝试重写 __new__ 函数,这将允许我在创建该类的实例之前向类添加属性。但我无法弄清楚如何做到这一点。

那么,在没有破坏南方和模型表格而没有复制粘贴的情况下,生成这些字段的方法是什么?

3 个答案:

答案 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