如何动态添加模型字段?

时间:2014-01-05 23:53:57

标签: django django-models

我想在models.py中动态指定模型字段。例如:

class ModelA(models.Model):
   pass # whatever
# immediately after class declaration in models.py
if django_is_not_non_rel:
   MyModel.all_modelb = models.ManyToManyField(ModelB, through="ModelAB")

但是这个代码示例不起作用。当条件为真时,ModelA在初始化所有内容后没有all_modelb字段。为什么????我如何影响我的意图?

1 个答案:

答案 0 :(得分:2)

使用Django创建动态列并非不可能,但您必须使用元类和/或继承来完成。

对于您的问题,最简单的解决方案可能是这样的:

if django_is_not_non_rel:
    class ModelABase(models.Model):
        MyModel.all_modelb = models.ManyToManyField(ModelB, through="ModelAB")

        class Meta:
            abstract = True

else:        
    class ModelABase(models.Model):
        class Meta:
            abstract = True

class ModelA(ModelABase):
   pass # whatever

甚至更简单(如果您不需要那么多的自定义):

class ModelAORMBase(models.Model):
    MyModel.all_modelb = models.ManyToManyField(ModelB, through="ModelAB")

    class Meta:
        abstract = True

if django_is_not_non_rel:
    ModelABase = ModelAORMBase
else:
    ModelABase = models.Model

class ModelA(ModelABase):
   pass # whatever