Django 信号
django信号
Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。 简单来说,信号允许特定的sender通知一组receiver某些操作已经发生。 这在多处代码和同一事件有关联的情况下很有用。
位置:
django.db.models.signals
常用:
pre_save **
django.db.models.signals.pre_save
- 这是在模型的save()方法的开头发送的。
带有此信号的参数:
-
sender
模型类。
instance
正在保存的实际实例。
raw
一个布尔值True如果模型按照显示的方式保存(即当加载固定装置时)。 不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。
using
正在使用的数据库别名。
update_fields
如果有字段被传递给Model.save()方法那么就是所传递的字段集,否则就是None。在任意位置写函数绑定即可
# 导入 信号 from django.db.models.signals import pre_save def my_callback(sender, **kwargs): print(sender) # 激活函数的 model print(kwargs) print("要保存了啊!") print('-' * 120) # 绑定信号 pre_save.connect(my_callback)
post_save **
django.db.models.signals.post_save
- 像pre_save一样,但是在save()方法的末尾发送。
带有此信号的参数:
-
sender
模型类。
instance
正在保存的实际实例。
created
一个布尔值True如果创建了新记录。
raw
一个布尔值True如果模型按照显示的方式保存(即当加载固定装置时)。 不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。
using
正在使用的数据库别名。
update_fields
如果有字段被传递给Model.save()方法那么就是所传递的字段集,否则就是None。
pre_delete
django.db.models.signals.pre_delete
- 在模型的delete()方法和queryset的delete()方法的开头发送。
带有此信号的参数:
-
sender
模型类。
instance
正在删除的实际实例。
using
正在使用的数据库别名。
post_delete
django.db.models.signals.post_delete
- 像pre_delete一样,但是在模型的delete()方法和queryset的delete()方法的末尾发送。
带有此信号的参数:
-
sender
模型类。
instance
正在删除的实际实例。请注意,该对象将不再位于数据库中,所以要非常小心使用此实例。
using
正在使用的数据库别名。
使用装饰器方法:
from django.dispatch import receiver
# 使用装饰器方式
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender="xxx") # sender 发送者
def my_callback(sender, **kwargs):
print(sender)
print(kwargs)
print("要保存了啊!")
print('-' * 120)