2014-01-05 175 views
1

我想在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

你爲什麼要做這個? –

+0

我試圖讓我的例子儘可能簡單。真實情況是隻有在特定條件成立時才添加動態模型字段。在我的情況下,該字段是一個ManyToManyField,如果Django框架是NonRel,則不會添加...您有解決方案嗎? – jacob

+0

爲什麼不在模型中添加字段,並在條件爲真的情況下向其添加關係? AFAIK,特定模型的所有實例應該具有相同的字段。 (但我沒有那種經驗與Django .. :) –

回答

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 
+0

謝謝@wolph。你的解決方案似乎是最簡單的,並且避免了元類的複雜性。 – jacob

+1

@jacob:我已經添加了一個替代版本,可能在將來更具可讀性:) – Wolph

+0

再次感謝@wolph。是的,你的第二個版本更簡單一些。 – jacob