国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

利用信號如何監控Django模型對象字段值的變化詳解

2020-02-16 10:52:33
字體:
來源:轉載
供稿:網友

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 signalsfrom django.dispatch import receiverfrom students.models import Studentfrom .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 signalsfrom django.dispatch import receiverfrom students.models import Studentfrom .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))            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 包头市| 乌拉特前旗| 当涂县| 曲松县| 开江县| 罗江县| 盈江县| 漳平市| 贺州市| 漳平市| 岫岩| 进贤县| 云浮市| 长寿区| 黄山市| 平安县| 乌兰浩特市| 江阴市| 潜山县| 鄂尔多斯市| 延川县| 丹巴县| 新丰县| 峡江县| 吴川市| 临海市| 石景山区| 广昌县| 闽侯县| 连南| 怀来县| 筠连县| 青田县| 孟津县| 来凤县| 玉田县| 井研县| 德昌县| 晋中市| 广水市| 石景山区|