Django信号实战
利用信号机制实现松耦合的事件驱动编程。 · 难度:入门 · +15XP
信号介绍
Django信号允许某些发送者通知一组接收者某个动作已经发生。它常用于在模型保存、删除等操作前后执行额外逻辑,而无需修改模型代码。
内置信号
| 信号 | 触发时机 |
|---|---|
| pre_save | 模型save()之前 |
| post_save | 模型save()之后 |
| pre_delete | 模型delete()之前 |
| post_delete | 模型delete()之后 |
| m2m_changed | 多对多关系变更时 |
定义接收器
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Profile, User
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)连接信号
推荐在apps.py的ready方法中导入信号模块:
# apps.py
from django.apps import AppConfig
class MyappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myapp'
def ready(self):
import myapp.signals练习提示: 在starter_code中编写一个post_save信号接收器,当Article模型被保存时,自动创建一条Log记录,内容为'Article saved: {title}'。