Django-admin save_model()和post_save信号之间的区别

时间:2019-02-23 16:21:53

标签: django django-models django-forms django-admin

对于我的应用程序,当通过表单保存模型时,我需要做一些额外的操作。实际上,如果表单中存在某些条件,我需要在另一个模型中添加一个值。

为此,我有两个选择,但是我想了解两者的优缺点。

  1. 使用post_save信号
  2. 覆盖admin.py中的save_model方法,因为在documentation中说:“覆盖此方法允许执行保存前或保存后的操作。”

我目前以这种方式使用后者

def save_model(self, request, obj, form, change):

    #some pre save operations....

    #this call the save model method
    super(MyModelAdmin, self).save_model(request, obj, form, change)

    #some post save operations...

它有效

但是我想了解的是:

  1. 对于我必须做的事情,两种方法之间的区别是什么,最正确的是什么。
  2. save_model方法是否与管理界面的使用有关?如果我使用另一个不同于Django管理员的前端会发生什么?
  3. 一般来说,执行保存之前和之后的操作以覆盖save_model和使用信号之间有什么区别?

3 个答案:

答案 0 :(得分:1)

我认为您做对了。这可能有助于您了解差异。

当您尝试仅从 django管理员创建或更新内容时,调用save_model中的

ModelAdmin方法,但无论位置如何都会触发信号发生动作的地方。这意味着如果您从 django管理员之外的其他地方更改模型,但又从 signals 进行更改,则pre方法中的postsave_model操作将不起作用>既可用于管理员视图之外,也可用于您自定义的编写代码块。

答案 1 :(得分:0)

如果可能的话,我宁愿添加信号来覆盖save_model。信号允许某些发送者通知一组接收者已经采取了某些措施。当许多代码片段可能对同一事件感兴趣时,它们特别有用。它也像event driven programming范式。这有助于使代码组织和清理。

答案 2 :(得分:0)

让我们举一个非常常规的过程示例。我们要注册一个新用户,我们还创建了一个配置文件模型,我们希望仅当保存有效的用户信息时才保存用户的配置文件。

我们可以在Django的管理员中创建一个新用户,并在saved_model中使用ModelAdmin方法将表单的其他部分保存到Profile模型中。这是这样做的“正常”方式。但是使用这种方式,您只能从Django Admin面板访问User和Profile。 Django Admin 外部的“用户注册”表格将不起作用,因为必须注册用户才能访问Django Admin控件。

但是使用post_save信号,无论您使用Django Admin面板还是保存到UserProfile模型的自定义表单,都可以创建和更新新的用户和配置文件

因此,使用信号是最灵活的方法,但是现在您必须确保有一种方法可以验证来自自定义表格的信息。