信号
Django包括一个“信号分配器”,它帮助允许解耦应用程序在框架中其他地方发生操作时得到通知。简而言之,信号允许某些 senders 通知一组 receivers 已经发生了一些行动。当许多代码可能对同一事件感兴趣时,它们特别有用。
Django提供了一些内置信号,让用户代码由Django本身通知某些操作。这些包括一些有用的通知:
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请求时发送。
完整的内置信号可以参考文档:https://www.rddoc.com/doc/Django/1.10.5/zh/ref/signals/
今天我们重点学习pre_save
和post_save
这两个内置信号。
pre_save
django.db.models.signals.pre_save
这个信号是在模型的 save()
方法执行之前调用的。我们看看随着信号一起发送的参数:
sender
1 | 模型类 |
instance
1 | 正在保存的实际实例 |
raw
1 | A boolean; True if the model is saved exactly as presented (i.e. when loading a fixture). One should not query/modify other records in the database as the database might not be in a consistent state yet. |
using
1 | 正在使用的数据库别名。 |
update_fields
1 | 要传送到 Model.save() 时要更新的字段集,如果 update_fields 未传递给 save(),则为 None。 |
实际代码输出
1 | from django.dispatch import Signal, receiver |
这里我们使用装饰器注册信号(稍后会学到),使用sender
指定模型,若是不指定模型则是在任何模型调用过save()
方法后都会调用该信号,我想这也不是我们期望的。
post_save
django.db.models.signals.post_save
这个信号是在模型的 save()
方法执行之后调用的。我们看看随着信号一起发送的参数:
sender
1 | 模型类。 |
instance
1 | 正在保存的实际实例。 |
created
1 | 布尔值; True,如果创建了新记录。 |
raw
1 | 布尔值; True,如果模型完全按提供的方式保存。不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。 |
using
1 | 正在使用的数据库别名。 |
update_fields
1 | 要传送到 Model.save() 时要更新的字段集,如果 update_fields 未传递给 save(),则为 None。 |
参考文章:
https://www.cnblogs.com/renpingsheng/p/7566647.html