在我的项目中,我想创建一些存储统计数据的模型,在这些模型中,每小时会有一两个字段,可以说,至少有24或48个字段这些模型。
通常情况下,我必须为每个模型编写24或48个字段(具有相同的属性,不同的字段名称),它不那么优雅和高效。例如:
class Stats(models.Model)
cnt_0 = models.IntegerField(default=0)
...
cnt_23 = models.IntegerField(default=0)
是否可以在循环中或以任何其他方式创建这些字段?
答案 0 :(得分:3)
无法以这种方式创建字段。更好的方法是创建另一个模型来保存这些属性的(name,value)
。
示例代码
class Stats(models.Model)
#your fields
class Attributes(models.Model)
name = models.CharField()
value = models.IntegerField(default=0)
stats = models.ForeignKey(Stats)
您可以添加统计数据所需的属性,并根据您的要求设置其他约束。
答案 1 :(得分:3)
如果存在静态数量的字段,则可以以更干的方式创建字段:
class Stats(models.Model):
pass
for i in range(24):
Stats.add_to_class('cnt_%s' % i, models.IntegerField(default=0)
for i in range(24, 48):
Stats.add_to_class('cnt_%s' % i, models.IntegerField(default=0, null=True, blank=True)
此方法与将字段显式定义为类属性基本相同。主要区别在于,在将这些字段添加到类之前发送class_prepared
信号。
对于动态数量的字段,请遵循Rohan的建议。