Django:动态模型字段定义

时间:2011-11-26 03:28:41

标签: django dynamic model field

嗨Stackoverflow人,

我有一个相当单调的模型定义,它包含从1到50的bin的字段。

为了概念验证,我手工编写了它,但必须有一种更好的方法来自动化模型定义并保持代码的整洁。

到目前为止,我按照以下方式做到了:

class Bins(models.Model):
    p1 = models.DecimalField(_('bin 1'), max_digits=6, decimal_places=2)
    p2 = models.DecimalField(_('bin 2'), max_digits=6, decimal_places=2)
    p3 = models.DecimalField(_('bin 3'), max_digits=6, decimal_places=2)
    ...
    p50 = ...

Django wiki上,我找到了动态模型定义的摘要,但它似乎不允许定义中的循环:

我已经尝试过以下代码,但是我收到一条错误信息,即MAX_BIN = 2语法无效。 我理解错误,我不能像我试过的那样在场上迭代。

Bins = type('Bins', (models.Model,), {     
    MAX_BIN = 50
    for i in range(MAX_BIN):
        name_sects = ["p", str(i)]
        "".join(name_sects): model.DecimalField(_("".join([bin ', str(i)])),
                             max_digits=6, decimal_places=2)
    })

这种动态类定义通常是否可行? 如果是这样,定义类的最佳方法是什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在您当前的版本中,您的循环位于dict的定义中。这是不允许的。但是,您可以在调用type之外的字典中定义字段,这样可以正常工作。

之类的东西
attrs = {
    other_field = models.IntegerField(),
    '__module__': 'myapp.models',
}

MAX_BIN = 50
   for i in range(MAX_BIN):
       name_sects = ["p", str(i)]
        attrs["".join(name_sects)] = model.DecimalField(_("".join(['bin ', str(i)])),
            max_digits=6, decimal_places=2)

Bins = type('Bins', (models.Model,), attrs)

答案 1 :(得分:0)

解决同一问题的简单解决方案:

class Bins(models.Model):
    MAX_BIN = 50
    for i in xrange(1, MAX_BIN + 1):
        vars()['p' + str(i)] = models.DecimalField('bin ' + str(i),
            max_digits=6, decimal_places=2)