国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲精品电影 | 中文字幕电影在线观看 | 色婷婷导航 | 九色91九色porny永久 | 国产99久久精品一区二区永久免费 | 久久这里只有精品免费 | 国产精品久久久久一区二区三区 | 在线观看免费黄色 | 日韩一二三区 | 日本一区高清 | 视频一区在线观看 | 亚洲免费在线观看 | 99国产精品99久久久久久 | 精品久草 | 日韩av免费在线观看 | 色天堂影院 | x99av成人免费 | 亚洲欧美在线视频 | 另类视频在线 | 免费三级黄色片 | 无码日韩精品一区二区免费 | 久久精品一 | 另类久久| 精品一区二区三区中文字幕 | 亚洲一区在线免费观看 | 一区二区三区四区在线 | 亚洲一区中文字幕在线观看 | 免费三级网站 | 久久久在线 | 久久精品亚洲精品 | 久久久xxx | 黄色国产在线看 | 中文字幕亚洲视频 | 国产精品久久久久久久久久久小说 | 久久综合区 | 91久久91久久精品免观看 | 在线播放国产一区二区三区 | 日韩精品一区二区三区在线播放 | 日韩精品在线观看视频 | 久久中文字幕一区 | 黄色一级片免费 |