利用信号如何监控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中将阿拉伯数字转换成中文的实现代码
May 19 Python
Python实现网站文件的全备份和差异备份
Nov 30 Python
Python模拟登录12306的方法
Dec 30 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
python模拟表单提交登录图书馆
Apr 27 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
opencv-python 提取sift特征并匹配的实例
Dec 09 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 Python
解决Django Haystack全文检索为空的问题
May 19 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
php数据库连接
2006/10/09 PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
JavaScript delete操作符应用实例
2009/01/13 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
你必须知道的Javascript知识点之"字面量和对应类型"说明介绍
2013/04/23 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
从零开始搭建一个react项目开发
2018/02/09 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
Python ftp上传文件
2016/02/13 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Python开发的实用计算器完整实例
2017/05/10 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
python爬虫中多线程的使用详解
2019/09/23 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python脚本调试工具安装过程
2021/01/11 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
医科学校毕业生自荐信
2013/11/09 职场文书
年会主持人开场白台词
2015/05/29 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
git中cherry-pick命令的使用教程
2022/06/25 Servers
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技