我想在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字段。为什么????我如何影响我的意图?
答案 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