案例. 該模型使用外來鍵引用自己本身。
from django.db import models
class
category
(models.model)
: name = models.textfield(
) parent_cat = models.foreignkey(
'self'
,on_delete=models.cascade)
on_delete引數如下:
cascade:級聯操作。如果外來鍵對應的那條資料被刪除了,那麼這條資料也會被刪除。
protect:受保護。即只要這條資料引用了外來鍵的那條資料,那麼就不能刪除外來鍵的那條資料。如果我們強行刪除,django就會報錯。
set_null:設定為空。如果外來鍵的那條資料被刪除了,那麼在本條資料上就將這個字段設定為空。如果設定這個選項,前提是要指定這個字段可以為空。
set_default:設定預設值。如果外來鍵的那條資料被刪除了,那麼本條資料上就將這個字段設定為預設值。如果設定這個選項,== 前提是要指定這個字段乙個預設值 ==。
set():如果外來鍵的那條資料被刪除了。那麼將會獲取set函式中的值來作為這個外來鍵的值。set函式可以接收乙個可以呼叫的物件(比如函式或者方法),如果是可以呼叫的物件,那麼會將這個物件呼叫後的結果作為值返回回去。== 可以不用指定預設值 ==
do_nothing:不採取任何行為。一切全看資料庫級別的約束。
注意:以上的配置都是django級別的,在資料庫中的級別依舊是restrict
資料庫層面的約束有:
restrict:預設的選項,如果想要刪除父表的記錄時,而在子表中有關聯該父表的記錄,則不允許刪除父表中的記錄;
noaction:同 restrict效果一樣,也是首先先檢查外來鍵;
cascade:父表delete、update的時候,子表會delete、update掉關聯記錄;
set null:父表delete、update的時候,子表會將關聯記錄的外來鍵字段所在列設為null,所以注意在設計子表時外來鍵不能設為not null;
為什麼在django中可以是用不同的約束去運算元據庫呢。
比如 django 中on_delete=cascade
, 但是資料庫的外來鍵約束是restrict. 在進行刪除a表資料時,發現被外來鍵約束著,使資料不能被刪除,則django會先去刪除約束的b表資料,然後再來刪除a表資料。
Django 外來鍵查詢和反查詢
一 foreignkey property裝飾器的作用是返回乙個屬性特性,在資料庫中也有一些小技巧可以拿來用,比如今天要寫的外來鍵查詢和反向查詢的內容。1 from django.db import models23 class person models.model 4 name models.c...
Django外來鍵關係描述
注 本文需要你有一定的資料庫知識,本文的資料庫語法使用mysql書寫 django中,跟外來鍵有關的關係有三種,下面來一一介紹。這種最好理解,說白了就是最普通的外來鍵,看看下面兩個模型 class goodstype models.model name models.charfield max le...
django外來鍵獲取資料
用django寫乙個專案時,使用外來鍵獲取資料遇到乙個問題。models建立的購物車表 class carmodel models.model user models.foreignkey usermodel 關聯使用者 goods models.foreignkey goods 關聯商品 c nu...