是否可以动态定义模型字段的名称?

时间:2009-04-28 09:18:43

标签: django django-models

现在我有了这段代码:

class Mymodel(models.Model):
    xxxx_count = ForeignCountField(filter={'foreign_table__xxxx': True})
    yyyy_count = ForeignCountField(filter={'foreign_table__yyyy': True})
    zzzz_count = ForeignCountField(filter={'foreign_table__zzzz': True})
    qqqq_count = ForeignCountField(filter={'foreign_table__qqqq': True})
    ssss_count = ForeignCountField(filter={'foreign_table__ssss': True})
    rrrr_count = ForeignCountField(filter={'foreign_table__rrrr': True})

我想要这样的事情:

class Mymodel(models.Model):
    for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']:
        setattr(self, '%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True}))

但是当我尝试这样做时,错误提出:“自我没有定义”。我是否需要将此代码放入其他地方?

4 个答案:

答案 0 :(得分:1)

自动创建多个类属性的方法是编写元类。当然可以继承Django的ModelBase元类并添加你需要的功能;但它也可能过度杀伤,而且可能不如仅仅写出来那么可维护。

答案 1 :(得分:1)

我想了解更多有关设计决策的信息。什么是ForeignCountField,为什么需要它?它不应该是各自表的财产吗? (管理者或类方法的方法?)

答案 2 :(得分:1)

如果要在模型定义之外添加字段,则必须使用add_to_class模型方法:

class Mymodel(models.Model):
    pass

for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']:
    Mymodel.add_to_class('%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True})))

答案 3 :(得分:-1)

也许您需要将代码放在类的构造函数方法 init 中。

def __init__(self, *args, **kwargs):
    .....
    super(MyModel, self).__init__(*args, **kwargs)

修改:抱歉这不起作用。也许你可以尝试查看This'这适用于django 0.96。有一些修改使得难以使用django版本1.0'进行调整。

如果你不喜欢Dirty and Quick你可以尝试这样的事情:

class Foo(models.Model):
    letters = ["A", "B", "C"]
    for l in letters:
        exec "%s_count = models.CharField(max_length=255)" % l