在Django中,保存前,保存后,删除前,删除后信号的典型用例是什么?

时间:2018-11-12 14:42:29

标签: django django-signals

在文档here中找不到与用例有关的内容。但是,我假设遵循以下原则:

  • 预保存:例如,用于计算字段,我们可能要计算出生日期起的年龄并将其保存在数据库中。
  • 保存后:用于涉及数据库中其他对象的操作,例如,更新评论可能需要重新计算电影的平均评分。
  • 预删除:老实说,不知道。
  • 后删除:可能与后保存类似,因为它会影响其他模型。

这些信号通常最常用的用例是什么?谢谢。

1 个答案:

答案 0 :(得分:2)

pre_save的一个非常普遍的用途是对标题进行拖尾,例如在书籍,文章或产品上。这也是一个原因,始终使用单独的ID来键入URL等总是更好,而不是仅依赖于Slug,否则,您要么无法更改Slug,要么需要解决持久性页面可能没有的事实永久性URL,或者必须支持旧版URL /重定向。

post_save也可以用于触发异步事件或使其排队。例如,如果使用户与单独的服务保持同步,则可能需要将对本地用户配置文件的成功更改提交给API,而这是您不希望用户等待的操作。从技术上讲,这种事情可以在其他地方完成,但是将其放入信号中意味着您不必担心在其他任何地方实现或调用它。

如果您具有以某种方式共享的对象,而严格限制的on_delete arguments不会捕获

pre_delete,则可以将其用作完整性检查。例如,如果只允许教师删除学生对象(如果该对象没有相关的出勤记录),则可以在其中强制执行该操作。

post_delete除了进行统计重新计算外,还可以用于提醒管理员或版主重要的用户行为。如果订户删除有效的付款方式,除了在付款处理器上停用该付款方式外,此信号还可能触发一封电子邮件,通知相关销售人员他们即将面临流失的危险。

当您提出信号时,我想说您正在稍微脱离简单的CRUD基础结构,这可能是Django最常见的用例。因此,很难指出“最常见的用例”,因为随着项目变得更加专业化,信号会变得越来越有用。

当您需要它们时它们很方便,但是就我个人而言,我每年只使用几次。我建议不要将它们作为首选。可以使用更简单,更易读的方式(例如,使用覆盖的save(...)方法)来完成与Django有关的很多或大多数事情。