保存其他多对多相关模型时自动更新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是不需要的。
感谢您的帮助。
答
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
答
您可以一次更新所有:
def update_firsts(self):
self.firsts.all().update(assigned=True)
这将有助于如果你想发布您的代码重写保存方法,因为这可能是解决方案。 (最好避免信号) –
Second @ Mr.Nun。共享你正在使用的'save()'压倒一切的问题。我假设这可能只是SO上的错字,但以防万一:'ManyToManyFields(First)'应该是单数ManyToManyField(First)' –
老实说,我迷失了。我试图肯定没有任何意义,但我仍然会用save方法编辑问题。 – naccode