利用訊號如何監控Django模型對象欄位值的變化詳解,django模型

來源:互聯網
上載者:User

利用訊號如何監控Django模型對象欄位值的變化詳解,django模型

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))

簡單的說就是在該模型廣播 post_init 訊號的時候,在模型對象中緩衝當前的欄位值;在模型廣播 post_save (或 pre_save )的時候,比較該模型對象的當前的欄位值與緩衝的欄位值,如果不相同則認為該欄位值發生了變化。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.