2011-12-29 108 views
3

我正在使用Django 1.3和MySQL 5.5數據庫後端。我的假設是Django默認在通過syncdb構建數據庫時模擬相關對象的ON DELETE CASCADE效果。但是,檢查數據庫顯示ON DELETE屬性實際上設置爲「RESTRICT」。這是一個錯誤?由於我無法刪除相關記錄,因此在刪除具有相關對象的對象時,我不斷收到djang-admin中的IntegrityError消息。Django沒有設置MySQL ON DELETE = CASCADE

謝謝

+0

你說的是對的。 Django _emulates_' ON DELETE CASCADE'。它不使用你的DBMS的這個特性。 Django將發佈必要的刪除語句以刪除相關模型。不知道爲什麼你在管理中看到這個問題。 – 2011-12-30 01:50:36

回答

2

似乎Django 1.3.1出於某種原因未能將ON DELETE CASCADE屬性應用於表。它可能與Windows上運行的MySQL-python 1.2.3接口有關。解決此問題的唯一方法是通過custom SQL

+1

遇到同樣的問題。 – 2012-05-24 18:49:17

1

Django在默認情況下會級聯。我不確定你爲什麼會得到一個ON DELETE RESTRICT。 Django 1.3可以讓你選擇另一個ON DELETE過程(定義一個字段時使用on_delete kwarg),如果你繼承了代碼庫,有人可能已經完成了之前的工作,然後將它從代碼中移除,但忽略更新數據庫。

我會建議手動更改列以將其設置回ON DELETE CASCADE。只需從那裏繼續。就像我說的那樣,這是開發人員必須告訴Django不要做的事情;它默認級聯。

+0

這是我自己的代碼庫我從來沒有將on_delete選項設置爲CASCADE以外的任何其他選項。我已經運行了python manage.py sql app_name命令並注意到沒有對ON DELETE CASCADE的引用。有些奇怪的事情正在發生,我無法弄清楚它是什麼。 – 2011-12-29 20:47:28

5

Django 模擬 ON DELETE CASCADE在Python中 - 這就是爲什麼不需要它在數據庫表上設置。實際上,設置RESTRICT甚至可能是有意義的,因爲這意味着您不會意外刪除任何相關對象而不會在管理員中對其進行警告。

就你而言,似乎你可能有Django不知道設置的外鍵約束 - 或者你可能試圖通過原始SQL刪除;我無法從你的問題中得知。

如果問題是無法從管理員或ORM中刪除,那麼您需要確保您的模型已正確定義。 django會負責收集相關對象並執行級聯本身。

如果問題是刪除不能從原始SQL中工作,那麼您需要先手動刪除相關對象,或者放鬆SQL約束 - 在這種情況下,將其更改爲級聯可能是正確的解。

+0

也許事情已經改變,因爲這個評論,但使用Django 1.9,約束肯定是不被模擬創建,並創建沒有級聯應用。 – AaronM 2016-07-14 21:46:04