十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章將為大家詳細(xì)講解有關(guān)如何使用信號(hào)監(jiān)控Django模型對(duì)象字段值的變化,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
成都創(chuàng)新互聯(lián)專注于鹿邑網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供鹿邑營(yíng)銷型網(wǎng)站建設(shè),鹿邑網(wǎng)站制作、鹿邑網(wǎng)頁(yè)設(shè)計(jì)、鹿邑網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造鹿邑網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鹿邑網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
Django 信號(hào) (Signals) 的功能類似于 WordPress 的動(dòng)作 (action),用于為項(xiàng)目全局增加事件的廣播 (dispatch) 與接收 (receive) 機(jī)制。其中,靈活使用其內(nèi)置的模型信號(hào) (Model Signals) 的接收功能就可以監(jiān)控大部分模型對(duì)象 (Model instances) 的變化。因?yàn)椴恍枰薷哪P捅旧淼拇a,在進(jìn)行跨應(yīng)用 (App) 監(jiān)控時(shí)有低耦合的優(yōu)勢(shì)。
信號(hào)的基本用法官方文檔上的 主題 與 參考 上已經(jīng)有詳細(xì)描述。本文只提幾個(gè)要點(diǎn)(本文環(huán)境:Django 1.8 & Python 3.4):
官方推薦在應(yīng)用目錄下新增一個(gè) signals.py
文件,同時(shí)參考官方文檔的 應(yīng)用配置 節(jié)中自定義應(yīng)用配置 (AppConfig) ,重載應(yīng)用配置類的 run
方法,在該方法內(nèi)調(diào)用 from . import signals
推薦使用 django.dispatch.receiver
這個(gè)裝飾器進(jìn)行信號(hào)的接收:
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)
從代碼可讀性的角度來講,建議一個(gè)接收函數(shù)只做一件事。
從上一段代碼可以知道,通過接收模型 post_save
信號(hào),可以得知發(fā)生了保存模型對(duì)象的操作,并且還可以區(qū)分出是創(chuàng)建了模型對(duì)象還是更新了模型對(duì)象。然而,模型信號(hào)并沒有提供針對(duì)特定字段值變化的廣播功能,雖然該信號(hào)提供了 update_fields
參數(shù),但是并不能證明在該參數(shù)中的字段名的字段值一定發(fā)生了變化,所以我們要采用一個(gè)結(jié)合 post_init
信號(hào)的變通方法。
舉一個(gè)例子:當(dāng)學(xué)生名字發(fā)生改變之后發(fā)布一條公告。
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))
簡(jiǎn)單的說就是在該模型廣播 post_init
信號(hào)的時(shí)候,在模型對(duì)象中緩存當(dāng)前的字段值;在模型廣播 post_save
(或 pre_save
)的時(shí)候,比較該模型對(duì)象的當(dāng)前的字段值與緩存的字段值,如果不相同則認(rèn)為該字段值發(fā)生了變化。
關(guān)于如何使用信號(hào)監(jiān)控Django模型對(duì)象字段值的變化就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。