中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-11-09 18:01:11 來源:億速云 閱讀:109 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關如何使用信號監控Django模型對象字段值的變化,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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 )的時候,比較該模型對象的當前的字段值與緩存的字段值,如果不相同則認為該字段值發生了變化。

關于如何使用信號監控Django模型對象字段值的變化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孝昌县| 昌江| 建阳市| 晋宁县| 仁怀市| 剑河县| 什邡市| 杭州市| 类乌齐县| 桂林市| 南平市| 社会| 孝昌县| 肇东市| 武隆县| 波密县| 武安市| 岢岚县| 合肥市| 萍乡市| 舞钢市| 高青县| 宜丰县| 巴彦县| 五常市| 米脂县| 什邡市| 肇东市| 通州区| 潮安县| 南陵县| 尼玛县| 淳安县| 南木林县| 昌乐县| 肇庆市| 阜城县| 凤庆县| 容城县| 嘉祥县| 绿春县|