保存其他多对多相关模型时自动更新Django模型中的特定字段

问题描述:

如何在保存相关模型的实例时自动更新模型的字段?我需要解决这样的情景:保存其他多对多相关模型时自动更新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

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

您可以一次更新所有:

def update_firsts(self): 
    self.firsts.all().update(assigned=True)