第四章:Model 數據層(2)

第一節:刪除級聯關係

處理刪除關聯數據 on_delete 可選參考

刪除關係 代碼 備註
連帶刪除 models.CASCADE 默認值,默認刪除數據(後臺管理的默認)
不給刪 models.PROTECT 不存在關聯時允許,否則不允許
刪後爲NULL models.SET_NULL 關聯的數據爲空,設置後可能要在後面添加blank=True,null=True
刪後爲默認 models.SET_DEFAULT 關聯數據變回默認,但前提是字段有默認值,設置後可能要在後面添加default=5,blank=True,null=True
刪除時動態指向一個實體 models.SET() 一般不用

定義級聯關係

在這裏插入圖片描述定義完需要執行數據遷移

python manage.py makemigrations
python manage.py migrate

注意:多對多關係並沒有級聯關係的設定。刪除數據儘量不能在後臺管理刪除,因爲後臺默認都是連帶刪除

例:嘗試刪除有級聯關係的某用戶
在這裏插入圖片描述

第二節:使用Manage模型

objects是什麼

我們常常使用className.object進行數據的查詢操作,那麼什麼是objects?它的類型是什麼?還可以對它進行什麼樣的操作?

  • 1、objects的類型:<class 'django.db.models.manager.Manager'>

  • 2、objects是一個隱式屬性
    在追源碼時,我們發現,objects是在 models包下 manager.py裏的一個Manager類,這個類空空如也,並未顯示地定義objects,可見objects是隱式的、動態生成的、由 系統/框架根據需求,自動創建的 model.Manager 對象
    在這裏插入圖片描述

  • 3、當我們手動創建(重寫)了Manager對象的時候,它就不會自動生成了

重寫Manager

作用:配置默認的數據創建方式和查詢方式,甚至還可以編寫新的方法,增加新的功能

重寫Manage,實現過濾

在這裏插入圖片描述

在對數據進行查詢時,查詢所有使用 objects.all() ,可以查詢所有。追源碼發現,all() 方法的返回值,其實就是 self.get_queryset(),因此,在定義新的objects時,可以重寫 self.get_queryset() 的方法,使之默認邏輯過濾一些不想要的對象。那麼在使用新的 newObjects.all() 時,便有了新的功能。

例1:默認過濾

添加“上帝”有戶,用於過濾做準備
在這裏插入圖片描述
定義新的對象,重寫方法,使之過濾
在這裏插入圖片描述
使用新的Manager對象替代object,依然可以使用原來object的所有方法。如:

例2:
在這裏插入圖片描述
在這裏插入圖片描述
執行結果:
在這裏插入圖片描述

重寫Manage,實現簡化添加用戶
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章