立即登录

注册账号

联系我们

2022年4月16日 10:45

Django 知识点之Signals

1. Signals

django.db.models.signals.pre_save & django.db.models.signals.post_save

一个模型的 save() 方法被调用之前或之后发出。

django.db.models.signals.pre_delete & django.db.models.signals.post_delete

一个模型的 delete() 方法或查询结果集的 delete() 方法被调用之前或之后发出。

django.db.models.signals.m2m_changed

一个模型的 ManyToManyField 更改后发出。

django.core.signals.request_started & django.core.signals.request_finished

Django 发起或结束一个 HTTP 请求后发出。

from django.db.models.signals import pre_save
from django.dispatch import receiver
from learn.models import Student

@receiver(pre_save, sender=Student)
def change_status(sender,instance, **kwargs):
    instance.status = 'disable'
    print(sender) # <class 'learn.models.Student'>
    print(instance) # <object student>
    print(kwargs) 
    # {'signal': <django.db.models.signals.ModelSignal object at 0x000001677C6DFF40>,
    # 'raw': False, 'using': 'default', 'update_fields': None}

注意:在pre_save()和post_save()的信号接收中,不能再instance.save(),否则会无限递归

注册激活信号

class LearnConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'learn'

    def ready(self):
        import learn.signals

留言

给我留言