1. 程式人生 > 其它 >django中訊號

django中訊號

# 訊號的理解
在某個行為進行的某個階段給這個行為新增一個附帶的行為

# 相關api
## 資料表
pre_init  # django的model執行其構造方法前,自動觸發
post_init  # django的model執行其構造方法後,自動觸發
pre_save  # djangod的model物件儲存前,自動觸發
post_save  # django的model物件儲存後,自動觸發
pre_delete  # django的model物件刪除前,自動觸發
post_delete  # django的model物件刪除後,自動觸發
m2m_changed  # django的model中使用m2m欄位操作第三表(add,remove,clear)前後,自動觸發
class_prepared  # 程式啟動時,檢測已註冊的app中的model類,對於每一個類,自動觸發

## migrate命令
pre_migrate   # 執行migrate前,觸發
post_migrate  # 執行migrate後,觸發

## url請求相關
request_started  # 請求到來前,觸發
request_finished  # 請求結束後,觸發
got_request_exception  # 請求異常後,觸發

## 測試
setting_changed  # 使用test測試修改配置檔案,觸發
template_rendered  # 使用test測試渲染模板時,觸發

## 資料庫
connection_created  # 建立資料庫連線時,觸發

# 實際應用
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save)
def do_something(sender, **kwargs):
    print("i'am doing it now!")
    
上面例子通過receiver裝飾器將do_something函式新增到了sender物件在儲存之前必須做的事情的清單裡面,也就是說任何一個sender物件在被儲存進資料庫之前肯定會在後臺列印一句i'am doing it now!
可能這裡對sender具體指的誰不是很明確,這裡明確強調下,如果receiver裝飾器中沒有額外對sender引數進行宣告,sender代表當前app下的所有資料模型
既然說了receiver中也可以指定引數,那就是說訊號也是可以針對某些具體的資料模型進行訊號接受的
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(pre_save, sender=MyModel)  # pre_save指定訊號觸發型別,sender指定只有MyModel模型發出的訊號會被receiver接受並執行下面邏輯
def my_handler(sender, **kwargs):
    ...

-------------------------------------------

個性簽名:程式碼過萬,鍵盤敲爛!!!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!