就像此时此刻的心情,不言而喻。。。
在app目录下创建信号文件signal_processor
from .dingtalk import sendfrom .models import Candidatefrom .tasks import send_messagefrom django.contrib import messagesfrom django.dispatch import receiver# @receiver(signal=pre_delete, sender=Candidate, dispatch_uid="pre_delete_notify_callback")# @receiver(signal=post_delete, sender=Candidate, dispatch_uid="post_delete_notify_callback")def notify_callback(sender, instance=None, created=False, **kwargs):candidates = ''interviewers = ''phone = []candidates = instance.username + ';' + candidatesinterviewers = instance.first_interviewer_user.username + ';' + interviewersphone.append(int(instance.first_interviewer_user.account_phone))send(' %s 是个大笨蛋,红颜与否,英才也罢,命皆为定数,都怪 %s ,都怪他!' % (candidates, interviewers), phone)logger.info(candidates)post_delete.connect(notify_callback, sender=Candidate, dispatch_uid="post_delete_notify_callback")# from ..jobs.models import Resume### def notify_callback(sender, instance=None, using=None, **kwargs):# dict_obj = model_to_dict(instance, exclude=("picture", "attachment"))# message = "Instance of %s has been deleted: %s" %(type(instance), json.dumps(dict_obj, ensure_ascii=False))# send(message)### post_delete.connect(notify_callback, sender=Resume, dispatch_uid="post_delete_notify_callback")
这边记录了两种方式,装饰器方式为注释的那个。
常见的signal方式见文档
eg。
Django内置了一整套信号,下面是一些比较常用的:
- django.db.models.signals.pre_save & django.db.models.signals.post_save
post_save在ORM模型的save()方法调用之前或之后发送信号
- django.db.models.signals.pre_delete & django.db.models.signals.post_delete
post_delete在ORM模型或查询集的delete()方法调用之前或之后发送信号。
- django.db.models.signals.m2m_changed
m2m_changed当多对多字段被修改时发送信号。
- django.core.signals.request_started & django.core.signals.request_finished
request_finished当接收和关闭HTTP请求时发送信号。
而后记得在apps.py文件中覆盖ready方法,否则不会生效
from django.apps import AppConfigclass InterviewConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'interview'def ready(self):from .signal_processor import notify_callback
扩展内容:定义一个自定义信号!
