2017-02-23 35 views
0

如何在保存相關模型的實例時自動更新模型的字段?我需要解決這樣的情景:保存其他多對多相關模型時自動更新Django模型中的特定字段

class First(models.Model): 
    name = models.CharField(max_length=100) 
    assigned = models.BooleanField(default=False) 

class Second(models.Model): 
    some_attribute = models.CharField(max_length=100) 
    firsts = models.ManyToManyField(First) 

所以,每次我創建二審時我想自動更新「分配」屬性爲第一種模式的每一個相關的對象,並將其更改爲True。

爲了簡化,我並不是說我在同一個項目的不同應用程序中有這個模型,我想這不是那麼相關,我只需要它的基礎知識。

我試圖重寫第二的保存方法,但有麻煩通過相關對象進行迭代:

def save(self, *args, **kwargs): 
    super(Second, self).save(*args, **kwargs) # Call the "real" save() method. 
    items = self.firsts 
    for item in items: 
     item.assigned = True 
     item.save() 

我也試圖避免信號,因爲這聽起來像是和推進的話題,我是初學者程序員和我intuit應該有一個更簡單的方法來做到這一點。 'First'對象在該模型的CreateView中創建;內聯formset是不需要的。

感謝您的幫助。

+0

這將有助於如果你想發佈您的代碼重寫保存方法,因爲這可能是解決方案。 (最好避免信號) –

+0

Second @ Mr.Nun。共享你正在使用的'save()'壓倒一切的問題。我假設這可能只是SO上的錯字,但以防萬一:'ManyToManyFields(First)'應該是單數ManyToManyField(First)' –

+0

老實說,我迷失了。我試圖肯定沒有任何意義,但我仍然會用save方法編輯問題。 – naccode

回答

0

Second模型的save方法不適合做你需要的地方,因爲相關對象目前還沒有更新。在保存您的Second模型後,您應該更新您的First模型,例如用於創建或更新Second實例的窗體的save方法。

Second模式:

def update_firsts(self): 
    items = self.firsts.all() 
    for item in items: 
     item.assigned = True 
     item.save() 

形式:

def save(self, *args, **kwargs): 
    instance = super(SecondForm, self).save(*args, **kwargs) 
    instance.update_firsts() 
    return instance 
+0

我有錯誤「'ManyRelatedManager'對象不可迭代」。它需要update_firsts中的'.all()',比如'items = self.firsts.all()'。謝謝 ! – naccode

+0

@naccode好的我更新了我的答案。如果它解決了你的問題,請接受它。 – albar

0

您可以一次更新所有:

def update_firsts(self): 
    self.firsts.all().update(assigned=True) 
相關問題