利用信号如何监控Django模型对象字段值的变化详解


Posted in Python onNovember 27, 2017

django信号系统

django自带一套信号发射系统来帮助我们在框架的不同位置传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)推送给一组接受者(receivers).信号系统在我们多处代码与同一个事件相关是特别有用.

既然是信号系统,那么必须包含以下要素:

 1. 发送者-谁发送了信号

 2. 信号-发送的信号本身

 3. 接收者-信号是发给谁的

Django 信号 (Signals) 的功能类似于 WordPress 的动作 (action),用于为项目全局增加事件的广播 (dispatch) 与接收 (receive) 机制。其中,灵活使用其内置的模型信号 (Model Signals) 的接收功能就可以监控大部分模型对象 (Model instances) 的变化。因为不需要修改模型本身的代码,在进行跨应用 (App) 监控时有低耦合的优势。

基本用法

信号的基本用法官方文档上的 主题 与 参考 上已经有详细描述。本文只提几个要点(本文环境:Django 1.8 & Python 3.4):

代码组织

官方推荐在应用目录下新增一个 signals.py 文件,同时参考官方文档的 应用配置 节中自定义应用配置 (AppConfig) ,重载应用配置类的 run 方法,在该方法内调用 from . import signals

接收信号

推荐使用 django.dispatch.receiver 这个装饰器进行信号的接收:

from django.db.models import signals
from django.dispatch import receiver

from students.models import Student
from .models import Announcement

@receiver(signals.post_save, sender=Student)
def welcome_student(instance, created, **kwargs):
 if created:
  Announcement.objects.create(content='Welcome new student ' + instance.name)

从代码可读性的角度来讲,建议一个接收函数只做一件事。

监控特定字段 (field) 值的变化

从上一段代码可以知道,通过接收模型 post_save 信号,可以得知发生了保存模型对象的操作,并且还可以区分出是创建了模型对象还是更新了模型对象。然而,模型信号并没有提供针对特定字段值变化的广播功能,虽然该信号提供了 update_fields 参数,但是并不能证明在该参数中的字段名的字段值一定发生了变化,所以我们要采用一个结合 post_init 信号的变通方法。

举一个例子:当学生名字发生改变之后发布一条公告。

from django.db.models import signals
from django.dispatch import receiver

from students.models import Student
from .models import Announcement

@receiver(signals.post_init, sender=Student)
def welcome_student(instance, **kwargs):
 instance.__original_name = instance.name

@receiver(signals.post_save, sender=Student)
def welcome_student(instance, created, **kwargs):
 if not created and instance.__original_name != instance.name:
  Announcement.objects.create(content=
   'Student %s has renamed to %s' % (instance.__original_name, instance.name))

简单的说就是在该模型广播 post_init 信号的时候,在模型对象中缓存当前的字段值;在模型广播 post_save (或 pre_save )的时候,比较该模型对象的当前的字段值与缓存的字段值,如果不相同则认为该字段值发生了变化。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。  

Python 相关文章推荐
python 实现删除文件或文件夹实例详解
Dec 04 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
Python有参函数使用代码实例
Jan 06 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
什么是Python中的顺序表
Jun 02 Python
pandas DataFrame运算的实现
Jun 14 Python
深入理解Python中range和xrange的区别
Nov 26 #Python
PyCharm在win10的64位系统安装实例
Nov 26 #Python
python shell根据ip获取主机名代码示例
Nov 25 #Python
python自动裁剪图像代码分享
Nov 25 #Python
分享一个简单的python读写文件脚本
Nov 25 #Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 #Python
python多进程实现进程间通信实例
Nov 24 #Python
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
PHP经典的给图片加水印程序
2006/12/06 PHP
用PHP制作的意见反馈表源码
2007/03/11 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
用PHP代码给图片加水印
2015/07/01 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
PHP 图片处理
2020/09/16 PHP
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
python中yield的用法详解
2021/01/13 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
城市规划毕业生求职信
2013/10/10 职场文书
毕业自我鉴定
2013/11/05 职场文书
单位实习证明怎么写
2014/01/17 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
社区母亲节活动记录
2014/03/06 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
唐山大地震的观后感
2015/06/05 职场文书