Django orm中的外鍵級聯刪除

這裏的系統環境爲django1.6   os爲win7

今天有個需求說的是添加一個地區表,然後用外鍵和幾個非常重要的實體表來做關聯(地區表作爲其他表的外鍵),寫完地區的刪除操作的時候,測試了下代碼,功能正常。可是眼睛移動到控制檯輸出的時候傻了

connexesql ->DELETE FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s)
connexesql ->DELETE FROM `ad_ad` WHERE `ad_ad`.`area_id` IN (%s, %s, %s)
connexesql ->DELETE FROM `mngm_area` WHERE `id` IN (%s, %s, %s)

我這刪除地區的時候竟然把他關聯的實體先刪除了!!!   這個地區只是個附屬屬性,刪除它的時候竟然把更重要的實體都刪除,這可是嚴重的問題啊。
於是查詢了下django orm中models中關於每個field定義的檔, https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ForeignKey 。 然後把字段定義修改成如下:

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

當地區area刪除的時候把其他表關聯到此字段設置爲null,這樣就只是把area的記錄刪除了。
django中外鍵小常識:
* 外鍵關聯的是一個對象,自動生成的外鍵名稱會在關聯的對象的名稱後面加上個 "_id" 來作爲字段名稱
* 默認情況下,外鍵會自動創建索引,會自動做級聯刪除, 默認的外鍵是字段是那張 表的主鍵

models.SET_NULL這裏還有其他幾個選項:

* SET_NULL 當外鍵的字段被刪除的時候設置爲null前提是指定了 null=True

* CASCADE  默認的選項,當外鍵關聯的字段刪除的時候,所有其他表級聯刪除

* SET_DEFAULT 設置一個默認值,當關聯的記錄刪除的時候恢復成默認值

*DO_NOTHING  django不做任何事情,數據庫返回什麼就報什麼

*  SET()¶ 還可以set一個函數,當關聯記錄刪除的時候觸發得到一個值

對於orm或者說框架,總有很多默認設置,當我們開發的時候一定要多測試多查閱文檔才能更好的使用,不至於犯下一些驚人的錯誤。

本文出自 “orangleliu筆記本” 博客,轉載請務必保留此出處http://blog.csdn.net/orangleliu/article/details/40268495

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章