Django 中预保存、post-保存、预删除、post-删除信号的典型用例是什么?

What are the typical use cases for pre-save, post-save, pre-delete, post-delete signals in Django?

在文档 here 中找不到太多关于用例的信息。但是,我假设是这样的:

一般而言,这些信号最常见的用例是什么?谢谢

pre_save 的一个非常常见的用途是对标题进行 slugifying,例如在书籍、文章或产品上。这也是最好保留一个单独的 ID 以在 URL 等中键入的原因之一,而不是仅仅依赖 slug,否则你要么无法更改 slug,要么需要解决持久页面可能没有的事实持久性 URL,或者必须支持旧版 URLs/redirects.

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

pre_delete 可以用作健全性检查,如果您有 object 以某种方式共享而不会被更严格的 on_delete arguments 捕获。例如,如果只允许教师删除学生 object,前提是该学生 object 没有关联的出勤记录,这可能是强制执行此操作的一个地方。

post_delete,除了统计重新计算之类的事情外,还可以用来提醒管理员或版主注意重要的用户行为。如果订阅者删除了一个有效的支付方式,除了在支付处理器上停用该支付方式之外,这个信号可能会触发向相关销售人员发送一封电子邮件,告知他们即将面临流失的危险。

当你谈到信号时,我会说你正在稍微脱离简单的 CRUD 基础设施,这可能是 Django 最常见的用例。因此很难指出 "most common use cases,",因为随着您的项目变得更加专业化,信号往往会变得更有用。

当你需要它们的时候它们很方便,但就我个人而言,我一年只使用它们几次;我不建议将它们作为第一选择。您需要使用 Django 完成的许多或大部分事情都可以更简单易读地完成,例如,重写的 save(...) 方法。