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
留言