django 外來鍵引用自身和on delete引數

2021-09-14 04:15:57 字數 1283 閱讀 2932

案例. 該模型使用外來鍵引用自己本身。

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...