就像此时此刻的心情,不言而喻。。。
    django之signal信号(day-32) - 图1

    在app目录下创建信号文件signal_processor

    1. from .dingtalk import send
    2. from .models import Candidate
    3. from .tasks import send_message
    4. from django.contrib import messages
    5. from django.dispatch import receiver
    6. # @receiver(signal=pre_delete, sender=Candidate, dispatch_uid="pre_delete_notify_callback")
    7. # @receiver(signal=post_delete, sender=Candidate, dispatch_uid="post_delete_notify_callback")
    8. def notify_callback(sender, instance=None, created=False, **kwargs):
    9. candidates = ''
    10. interviewers = ''
    11. phone = []
    12. candidates = instance.username + ';' + candidates
    13. interviewers = instance.first_interviewer_user.username + ';' + interviewers
    14. phone.append(int(instance.first_interviewer_user.account_phone))
    15. send(' %s 是个大笨蛋,红颜与否,英才也罢,命皆为定数,都怪 %s ,都怪他!' % (candidates, interviewers), phone)
    16. logger.info(candidates)
    17. post_delete.connect(notify_callback, sender=Candidate, dispatch_uid="post_delete_notify_callback")
    18. # from ..jobs.models import Resume
    19. #
    20. #
    21. # def notify_callback(sender, instance=None, using=None, **kwargs):
    22. # dict_obj = model_to_dict(instance, exclude=("picture", "attachment"))
    23. # message = "Instance of %s has been deleted: %s" %(type(instance), json.dumps(dict_obj, ensure_ascii=False))
    24. # send(message)
    25. #
    26. #
    27. # 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方法,否则不会生效

    1. from django.apps import AppConfig
    2. class InterviewConfig(AppConfig):
    3. default_auto_field = 'django.db.models.BigAutoField'
    4. name = 'interview'
    5. def ready(self):
    6. from .signal_processor import notify_callback

    扩展内容:定义一个自定义信号!
    image.png