1,信号
django.db.models.signals模块定义了模型系统发送的一组信号。信号允许某些发送者通知一组接收器已经发生了某些动作,当许多代码片段可能对相同的事件感兴趣时,它们特别有用。
例如:
pre_save在save()方法之前发送
post_save在save()方法结束时发送:
参数:
(sender, instance, created, **kwargs)
sender模型类
instance保存的模型实例
created布尔值,如果创建了新纪录则为true
2,接收信号
Signal.connect(receiver,sender = None,weak = True,dispatch_uid = None)
为了接受信号,用connect()注册一个接收方法,当信号发送的时候,该方法被调用
connect方法用于连接信号和信号处理函数,类似的概念相当于为某个事件(信号发出表示一个事件)注册观察者(处理函数),函数参数中receiver就是信号处理函数,sender表示信号的发送者,比如Django框架中的post_save()这个信号,任何一个模型在save()函数调用之后都会发出这个信号,但是我们只想关注某一个模型 save()方法调用的事件发生,就可以指定sender为我们需要关注的模型类。
3,使用场景举例:当用户发送评论的时候,通知文章作者
from django.db.models.signals import post_save
from .models import ArticleComment, Notification
#信号处理函数
def notify_handler(sender, instance, created, **kwargs):
create_p = instance.author#评论的作者
if created:#如果是新创建的评论,则保存消息通知
new_notify = Notification(create_p=create_p, comment=instance)
new_notify.save()
connect接收信号,指定信号处理函数以及信号的发送者
post_save.connect(notify_handler, sender=ArticleComment)
然后再使用添加评论的视图中引入