嗨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)
})
这种动态类定义通常是否可行? 如果是这样,定义类的最佳方法是什么?
感谢您的帮助!
答案 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)