利用信号如何监控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实现的阳历转阴历(农历)算法
Apr 25 Python
Python中使用hashlib模块处理算法的教程
Apr 28 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
Oct 22 Python
python中嵌套函数的实操步骤
Feb 27 Python
Python实现字符型图片验证码识别完整过程详解
May 10 Python
django数据库自动重连的方法实例
Jul 21 Python
python爬虫 正则表达式解析
Sep 28 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
Python实现word2Vec model过程解析
Dec 16 Python
Python实现初始化不同的变量类型为空值
Jun 02 Python
浅谈Python3中print函数的换行
Aug 05 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
咖啡知识大全
2021/03/03 新手入门
Cannot modify header information错误解决方法
2008/10/08 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
JavaScript中this详解
2015/09/01 Javascript
javascript实现动态标签云
2015/10/16 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
python实现二维插值的三维显示
2018/12/17 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
党员廉洁自律承诺书
2014/05/26 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
教师自荐信范文
2015/03/06 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL