Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用信号监控 Django 模型对象字段值的变化

使用信号监控 Django 模型对象字段值的变化

作者头像
BigYoung小站
发布于 2020-05-05 02:19:15
发布于 2020-05-05 02:19:15
2.1K00
代码可运行
举报
文章被收录于专栏:BigYoung小站BigYoung小站
运行总次数:0
代码可运行

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 这个装饰器进行信号的接收:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 信号的变通方法。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 )的时候,比较该模型对象的当前的字段值与缓存的字段值,如果不相同则认为该字段值发生了变化。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BigYoung小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django REST Framework-常用的信号类型(二)
pre_save信号在对象保存前触发,post_save信号在对象保存后触发。它们可以用于执行一些自定义的逻辑,如修改对象属性、发送邮件通知等。下面是一个pre_save信号和post_save信号的示例:
玖叁叁
2023/04/26
5110
Django的信号
Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。
菲宇
2019/06/13
8520
Django中的信号
Django中内置的signal Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Model_signals pre_init # Django中的model对象执行其构造方法前,自动触发 post_init # Django中的model对象执行其构造方法后,自动触发 pre_save # Djan
用户1214487
2018/01/24
1.6K0
Django中的信号
Django源码学习-4-Signals 信号量
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/07/30
1.1K0
Django源码学习-4-Signals 信号量
Django REST Framework-信号示例
上面的代码定义了一个名为do_something的函数,并将其注册为user_logged_in信号处理器。当用户成功登录时,do_something函数将被调用。我们可以在do_something函数中执行任何自定义的代码,如记录用户登录日志、更新用户信息等。
玖叁叁
2023/04/26
4270
Django信号量signals总结使用
Django信号量 #0 GitHub https://github.com/Coxhuang/django-signals.git #1 环境 python3.6 django==2.0.7 #2 需求 老板要求,每次数据库迁移时,变量a自增 老板要求,每次数据库D有新的数据添加进去时,变量b自增 … … #3 设置 #3.1 新建一个django项目 #3.2 配置文件 #3.2.1 目录结构 . ├── app │ ├── __init__.py │ ├── admin.py │ ├──
Autooooooo
2020/11/09
9840
Django信号量signals总结使用
利用Django和hAdmin快速开发管理系统(三)
IT不难
2023/11/17
1630
利用Django和hAdmin快速开发管理系统(三)
基于 Django 信号机制实现类似触发器的效果
我们都知道,在关系数据库中,为了保证数据完整性,我们都会使用一个叫做触发器的玩意。今天我就基于Django信号机制实现类似触发器的效果,在此之前我先简单介绍一下触发器。
不可言诉的深渊
2020/03/26
2.6K0
Django REST Framework-信号
Django REST Framework(DRF)中的信号(Signals)是一种非常有用的机制,可以让我们在某些重要的事件发生时执行一些自定义的代码。
玖叁叁
2023/04/25
7.3K1
Django进阶之缓存和信号
一、缓存 简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者mem
coders
2018/01/04
8940
Django进阶之缓存和信号
Django——信号
django——signal 其实可以理解为django内部的钩子,当某一个事件发生时,其它程序会触发并对其作出相关反应,通过signal回调处理函数(receivers),从而更大程度的解耦我们的项目 导入类库 1 from django.shortcuts import render 2 from django.http import HttpResponse 3 from django.core.signals import request_finished,request_starte
py3study
2020/01/19
7160
django 1.8 官方文档翻译:14-5 信号
Django包含一个“信号的分发器”,允许解耦的应用在信号出现在框架的任何地方时,都能获得通知。简单来说,信号允许指定的 发送器通知一系列的接收器,一些操作已经发生了。当一些代码会相同事件感兴趣时,会十分有帮助。
ApacheCN_飞龙
2022/11/27
6380
Django 的信号机制
Django 将 signal 描述为“信号调度员”,主要以信号的形式,来触发多个应用程序。这篇文章将从源码分析的角度,讲解 Django 中 signal 的工作机制及使用方法。
CS实验室
2021/03/22
8950
Django 的信号机制
31.Django缓存和信号
缓存  由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回 Django中提供了6种缓存方式: 开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块、pylibmc模块) 1.配置 # 此为开始调试用,实际内部不做任何操
zhang_derek
2018/04/11
9140
Django 常用工具 import 常用模块
from rest_framework import routers, serializers, viewsets
onety码生
2018/11/21
1.1K0
google 和 百度 SEO
1. 注册账号:https://search.google.com/search-console
卓越笔记
2023/02/18
3670
google 和 百度 SEO
Django的信号机制详解
Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。
KEVINGUO_CN
2020/03/17
9070
Python Django个人网站搭建10-扩展用户信息
作者: zifanwang  发布于2020-05-16
zifan
2021/12/14
5550
Python Django个人网站搭建10-扩展用户信息
django 关于User模型
User模型是这个框架的核心部分。他的完整的路径是在django.contrib.auth.models.User。以下对这个User对象做一个简单了解:
用户2200417
2022/05/24
1.2K0
list、dict和set的综合应用:排课系统(1)
我们都知道一个程序从本质上来说就是算法+数据结构,这次就以我的本科毕业设计——排课系统为例,专门讲解如何设计排课的算法和要用到的数据结构,在讲解这个算法之前,我们今天先做一些准备工作。
不可言诉的深渊
2020/06/16
1.3K3
list、dict和set的综合应用:排课系统(1)
相关推荐
Django REST Framework-常用的信号类型(二)
更多 >
LV.0
互联网公司信息安全工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验