【问题标题】:Django - Difference between admin save_model() and post_save signalDjango - 管理员 save_model() 和 post_save 信号之间的区别
【发布时间】:2019-07-17 12:28:12
【问题描述】:

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

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

  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 和使用信号进行保存前和保存后操作有什么区别?

【问题讨论】:

  • 在我看来,模型对象可以从应用程序内的任何位置保存,而不仅仅是 django 管理员。确保每次保存对象时都会发生某些事情的唯一方法是使用 pre/post_save 信号或覆盖 .save() 方法。之后,您所要做的就是注意批量更新。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为你说得对。这可能有助于您了解其中的区别。

    ModelAdmin 中的save_model 方法在您尝试从 django 管理员 创建或更新某些内容时调用,但信号会在 无论 发生的位置触发。这意味着如果您从 django admin 之外的某个位置更改模型,则 save_model 方法中的 pre 或 post 操作将不起作用,但 signals 将适用于两者在管理视图之外和您自定义编写的代码块之外。

    【讨论】:

      【解决方案3】:

      让我们举一个相当常规的例子来说明这个过程。我们想注册一个新用户,并且我们还创建了一个配置文件模型,我们希望仅在保存有效的用户信息时才保存用户的配置文件。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-15
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 2019-04-29
        • 1970-01-01
        相关资源
        最近更新 更多