簡體   English   中英

為什么Django會對外鍵進行級聯刪除?

[英]Why does Django do cascading deletes on foreign keys?

Django在具有外鍵的模型上進行級聯刪除作為默認值。 也就是說,假設您在A中有一個指向B的ForeignKey,並且您刪除了B,那么A也將被刪除。

這是眾所周知的 ,但是我沒有找到任何關於將其作為默認設計決策的合理理由,因為它看起來有多么不直觀。 有誰知道為什么會這樣?

7年前......

門票開放#7539

它開始被討論的地方。

幾年前由benjaoming

有人請求討論......我剛剛遇到了這個問題,我缺少的是知道關於級聯刪除的問題,因為它非常危險(你丟失數據!!)並且竊取了大量時間。 但是,預防它很簡單。 覆蓋模型的delete()方法並在相關模型的外鍵上調用clear()很簡單,它是一個手動實現,所有程序員都應該能夠理解。 但我可以想到另一種選擇:如果有問題的外鍵,如果null = True,為什么在刪除相關實例時不自動使用SET NULL? 對我來說,這比CASCADE更“直觀”。 畢竟,null = True是程序員指定並且必須在實現中的任何地方處理的東西,這也是他不需要級聯刪除這種關系的原因。 此外,如果on_delete可以在鍵字段中設置,則必須符合null選項..並與“intuition argument”一起創建兩個選項之間的1:1對應關系。 然后是“邏輯參數”:Django在Python代碼中處理它的邏輯,而不是在數據庫中處理它,數據庫被保存為一個簡單的存儲引擎。 RESTRICT選項是一個驗證問題,在大多數情況下可能會以這種方式處理,因此讓數據庫強制執行它會是多余的。 在模型級別啟用它可以為ModelForms中的一些不錯的新自動驗證鋪平道路,所以我認為這聽起來像一個很好的功能。 如果實現了所有這些,我建議從關鍵字段中刪除null選項,並根據on_delete設置它。

多年以后,該小組再次討論了這個問題。

Django開發人員(對Django本身的貢獻)
更改on_delete = CASCADE默認值

然后其他的票被創造 #21127#21961

我們到了這里。 ForeignKey和OneToOneField on_delete參數

為了提高對級聯模型刪除的認識,在Django 2.0中將需要ForeignKey和OneToOneField的on_delete參數。

更新模型和現有遷移以顯式設置參數。 由於默認值為models.CASCADE,因此將on_delete = models.CASCADE添加到不使用其他選項的所有ForeignKey和OneToOneField。 如果你不關心與舊版Django的兼容性,你也可以將它作為第二個位置參數傳遞。

這張票中有一個相當冗長的討論。 在Django 2.0中, 將需要 on_delete參數,因此將不再應用當前的默認行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM