文章目錄
第一節:刪除級聯關係
處理刪除關聯數據 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:
執行結果: