【问题标题】:Django trigger parent model save when editing inline in admin在管理员中编辑内联时,Django触发父模型保存
【发布时间】:2012-02-27 22:29:09
【问题描述】:

我有一个模型(父模型)与另一个模型(子模型)具有一对多关系。 Parent模型的save方法被覆盖:

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)

在管理面板中,多个子模型对象在父模型页面上使用 StackedInline 显示。如果父字段被编辑和保存,则调用 save 方法。当只有子字段被编辑时,Django 不会调用父的 save 方法(正如预期的那样,因为没有任何改变)。

强制保存父级的最佳方法是什么,即使只编辑了子级(这样我的覆盖方法就可以了)?

【问题讨论】:

  • 您希望您的方法仅在从 Admin 编辑内联时调用,还是在保存 ChildModel 时调用?
  • 它只能在管理员中编辑,所以以更简单的为准。

标签: python django django-admin


【解决方案1】:

您有几个解决方案。在这里,从简单到复杂:

您可以为调用ParentModel.saveChildModel 实现自定义save 方法。
您也可以连接到您的ChildModelpost_savepre_save 信号。

现在,如果您要一次更新大量 ChildModel 实例,这两种解决方案会很烦人,因为您将多次调用 ParentModel.save,可能没有目的。
然后,您可能想要使用以下内容:
覆盖您的ParentModelModelAdmin.change_view 来处理您的逻辑;然而,这非常棘手。

但是,我对您遇到的行为感到非常惊讶,从检查源代码来看,无论如何都应该保存对象;编辑与否。

【讨论】: