一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 利用信號如何監控Django模型對象字段值的變化詳解

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

2020-12-20 01:00pushiqiang Python

這篇文章主要給大家介紹了關于利用信號如何監控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 這個裝飾器進行信號的接收:

?
1
2
3
4
5
6
7
8
9
10
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 信號的變通方法。

舉一個例子:當學生名字發生改變之后發布一條公告。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 )的時候,比較該模型對象的當前的字段值與緩存的字段值,如果不相同則認為該字段值發生了變化。

總結

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

原文鏈接:http://blog.csdn.net/pushiqiang/article/details/74949465

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 俄罗斯处女 | 91交换论坛| 91在线视频播放 | 2019理论韩国理论中文 | 欧美在线观看视频一区 | 欧美va在线播放免费观看 | 暖暖的韩国免费观看 | 久热在线这里只有精品7 | 精品网站一区二区三区网站 | 亚洲国产精品高清在线 | 欧美亚洲国产另类 | 风间由美m3u8在线 | 美女私人影院 | 日韩精品免费一区二区三区 | 国产拍拍 | 韩国一级淫片特黄特刺激 | 久久精品手机观看 | 出水小说 | 国产男女爱视频在线观看 | 国产高清在线视频一区二区三区 | 欧美在线视频7777kkkk | 精品视频手机在线观看免费 | 手机看片自拍自自拍日韩免费 | 久久亚洲一级α片 | 美女扒开奶罩让男人吃奶 | 亚洲精品午夜久久aaa级久久久 | 无人影院在线播放视频 | 高清视频大片免费观看 | 免看一级一片一在线看 | 黄在线观看www免费看 | 国产女同精品 | 99热这里只有精品国产在热久久 | 美国videos| 高清男的插曲女的 欢迎你老狼 | 全黄h全肉细节修仙玄幻文 全彩调教侵犯h本子全彩妖气he | 大胆国模一区二区三区伊人 | 九九99精品 | 亚洲第一网色综合久久 | 扒开大腿狠狠挺进视频 | 天海翼最新作品 | 欧美亚洲另类综合 |