Django在管理界面内联编辑时触发父模型保存
我有一个模型(父模型)和另一个模型(子模型)之间是一对多的关系。父模型的保存方法被重写了:
class ParentModel(models.Model)
(...)
def save(self, *args, **kwargs):
(...) # Do sth with the model
super(ParentModel, self).save(*args, **kwargs)
class ChildModel(models.Model):
parent= models.ForeignKey(ParentModel)
在管理面板中,父模型页面上会显示多个子模型对象,使用的是堆叠内联的方式。如果编辑了父模型的某个字段并保存,就会调用保存方法。但是,如果只是编辑了子模型的字段,Django就不会调用父模型的保存方法(这是正常的,因为父模型没有变化)。
那么,有什么好的方法可以强制保存父模型,即使只是编辑了子模型(这样我重写的方法就能执行)呢?
1 个回答
3
你有几种解决方案。下面从简单到复杂介绍一下:
你可以为 ChildModel
实现一个自定义的 save
方法,这个方法会调用 ParentModel.save
。
你也可以连接到 ChildModel
的 post_save
或 pre_save
信号。
不过,如果你一次要更新很多 ChildModel
实例,这两种方法可能会让你感到烦恼,因为你会多次调用 ParentModel.save
,可能还没什么必要。
这时候你可能想用以下方法:
重写 ParentModel
的 ModelAdmin.change_view
来处理你的逻辑;不过这会比较复杂。
我对你遇到的情况感到有些惊讶,从源代码来看,这个对象应该无论如何都会被保存,不管是否被编辑。