Django Academy · 课时

post_save 与 pre_delete 信号

在模型发生变化时运行代码

第 1 / 4 课13 个步骤

post_save 与 pre_delete 信号 是 CoddyKit 上的免费 Django Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Django Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Django Academy 课程共包含 4 节课。

用一句话理解信号

信号让 Django 的某个部分宣布某件事已经发生,以便其他代码做出响应,而不必直接调用它。

为什么要响应事件

有时模型发生变化时,您希望执行一些副作用操作,例如用户注册后发送欢迎邮件。信号可以将这种响应逻辑从保存逻辑中分离出来。

保存后信号

保存后信号会在模型实例写入数据库后立即触发,因此您可以确定该行已经存在。

保存后接收器

您需要编写一个函数,并告诉 Django 在保存后信号触发时调用它。接收器会通过参数接收已保存的实例。

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Profile)
def on_save(sender, instance, **kwargs):
    print("saved", instance)

创建标志

保存后信号会传递一个创建布尔值:新行时为 True,更新时为 False。您可以利用它,仅在首次创建时运行代码。

def on_save(sender, instance, created, **kwargs):
    if created:
        print("new", instance)

删除前信号

删除前信号会在删除某行之前触发,因此代码运行时该实例仍然存在。

删除前接收器

您可以使用删除前信号在数据库行消失前清理相关资源,例如文件。此时实例仍然完整可用。

from django.db.models.signals import pre_delete

@receiver(pre_delete, sender=Photo)
def clean_up(sender, instance, **kwargs):
    instance.image.delete(save=False)

保存前和删除后也很重要

Django 还提供保存前和删除后信号。它们共同覆盖每次写入或删除前后的时刻。

发送者参数

发送者会告诉您触发信号的是哪个模型类。向接收器传入 sender=,使它只监听一个模型。

始终接受 kwargs

每个接收器都应接受**kwargs。Django 可能会传入额外参数,如果不接收这些参数,信号触发时就会产生错误。

解耦,不要埋藏逻辑

信号非常适合处理横切响应,但复杂逻辑可能变得难以追踪。当响应确实彼此独立时,再使用信号。

快速检查

测试保存后信号如何区分新行和更新。

回顾:响应模型事件

您已经了解了 Django 的信号:保存后信号会在写入后触发并提供创建标志,删除前信号会在删除前触发,而每个接收器都应接受 **kwargs。✅

免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「post_save 与 pre_delete 信号」课时是免费的吗?

是的 — 「post_save 与 pre_delete 信号」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Django Academy 课程的其余内容,请升级到 CoddyKit PRO。 Django Academy 课程共包含 4 节课。

「post_save 与 pre_delete 信号」这节课中我会学到什么?

在模型发生变化时运行代码 你通过在浏览器中直接运行的动手代码来练习 Django Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Django Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Django Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「post_save 与 pre_delete 信号」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Django Academy 课中编写并运行代码吗?

能。每节 Django Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. post_save 与 pre_delete 信号
  2. 正确连接接收器
  3. 编写自定义中间件
  4. 中间件顺序与 process_view
← 返回 Django Academy