post_save 与 pre_delete 信号
在模型发生变化时运行代码
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 反馈 — 无需本地设置。
此课程中的所有课时
- post_save 与 pre_delete 信号
- 正确连接接收器
- 编写自定义中间件
- 中间件顺序与 process_view