亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

利用信號(hào)如何監(jiān)控Django模型對(duì)象字段值的變化詳解

 更新時(shí)間:2017年11月27日 10:04:04   作者:pushiqiang  
這篇文章主要給大家介紹了關(guān)于利用信號(hào)如何監(jiān)控Django模型對(duì)象字段值變化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

django信號(hào)系統(tǒng)

django自帶一套信號(hào)發(fā)射系統(tǒng)來(lái)幫助我們?cè)诳蚣艿牟煌恢脗鬟f信息.也就是說(shuō),當(dāng)某一事件發(fā)生時(shí),信號(hào)系統(tǒng)可以允許一個(gè)或多個(gè)發(fā)送者(senders)將通知或信號(hào)(signals)推送給一組接受者(receivers).信號(hào)系統(tǒng)在我們多處代碼與同一個(gè)事件相關(guān)是特別有用.

既然是信號(hào)系統(tǒng),那么必須包含以下要素:

 1. 發(fā)送者-誰(shuí)發(fā)送了信號(hào)

 2. 信號(hào)-發(fā)送的信號(hào)本身

 3. 接收者-信號(hào)是發(fā)給誰(shuí)的

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

接收信號(hào)

推薦使用 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)

從代碼可讀性的角度來(lái)講,建議一個(gè)接收函數(shù)只做一件事。

監(jiān)控特定字段 (field) 值的變化

從上一段代碼可以知道,通過(guò)接收模型 post_save 信號(hào),可以得知發(fā)生了保存模型對(duì)象的操作,并且還可以區(qū)分出是創(chuàng)建了模型對(duì)象還是更新了模型對(duì)象。然而,模型信號(hào)并沒(méi)有提供針對(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)單的說(shuō)就是在該模型廣播 post_init 信號(hào)的時(shí)候,在模型對(duì)象中緩存當(dāng)前的字段值;在模型廣播 post_save (或 pre_save )的時(shí)候,比較該模型對(duì)象的當(dāng)前的字段值與緩存的字段值,如果不相同則認(rèn)為該字段值發(fā)生了變化。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。  

相關(guān)文章

  • Python fileinput模塊使用實(shí)例

    Python fileinput模塊使用實(shí)例

    這篇文章主要介紹了Python fileinput模塊使用實(shí)例,本文講解了典型用法、基本格式、默認(rèn)格式、常用函數(shù)和常見(jiàn)例子等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • PyCharm+PyQt5+QtDesigner配置詳解

    PyCharm+PyQt5+QtDesigner配置詳解

    這篇文章主要介紹了PyCharm+PyQt5+QtDesigner配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • python科學(xué)計(jì)算之scipy——optimize用法

    python科學(xué)計(jì)算之scipy——optimize用法

    今天小編就為大家分享一篇python科學(xué)計(jì)算之scipy——optimize用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • tensorflow1.x和tensorflow2.x中的tensor轉(zhuǎn)換為字符串的實(shí)現(xiàn)

    tensorflow1.x和tensorflow2.x中的tensor轉(zhuǎn)換為字符串的實(shí)現(xiàn)

    本文主要介紹了tensorflow1.x和tensorflow2.x中的tensor轉(zhuǎn)換為字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Flask框架中request、請(qǐng)求鉤子、上下文用法分析

    Flask框架中request、請(qǐng)求鉤子、上下文用法分析

    這篇文章主要介紹了Flask框架中request、請(qǐng)求鉤子、上下文用法,結(jié)合實(shí)例形式分析了flask框架中request、請(qǐng)求鉤子及上下文的功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • Python自動(dòng)化辦公之Word轉(zhuǎn)PDF的實(shí)現(xiàn)

    Python自動(dòng)化辦公之Word轉(zhuǎn)PDF的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹一下如何在?windows、mac、linux?三種系統(tǒng)中都可以生成?PDF?的解決方案,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • python中doctest庫(kù)實(shí)例用法

    python中doctest庫(kù)實(shí)例用法

    在本篇文章里小編給大家整理的是一篇關(guān)于python中doctest庫(kù)實(shí)例用法的相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • Python log模塊logging記錄打印用法解析

    Python log模塊logging記錄打印用法解析

    這篇文章主要介紹了Python log模塊logging記錄打印用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python 統(tǒng)計(jì)數(shù)據(jù)集標(biāo)簽的類別及數(shù)目操作

    Python 統(tǒng)計(jì)數(shù)據(jù)集標(biāo)簽的類別及數(shù)目操作

    這篇文章主要介紹了Python 統(tǒng)計(jì)數(shù)據(jù)集標(biāo)簽的類別及數(shù)目操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 提升Python編程效率的列表操作方法示例

    提升Python編程效率的列表操作方法示例

    這篇文章主要為大家介紹了提升Python編程效率的列表操作方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論