Django没有设置MySQL ON DELETE = CASCADE

时间:2011-12-29 17:10:54

标签: django django-admin

我正在使用Django 1.3和MySQL 5.5数据库后端。我的假设是,当通过syncdb构建数据库时,Django默认模拟相关对象的ON DELETE CASCADE效果。但是,检查数据库会发现ON DELETE属性实际上设置为“RESTRICT”。这是一个错误吗?由于我无法删除相关记录,因此在删除具有相关对象的对象时,我会在djang-admin中收到IntegrityError消息。

谢谢

3 个答案:

答案 0 :(得分:5)

Django 在Python中模拟 ON DELETE CASCADE - 这就是为什么不需要在数据库表上设置它。实际上,设置RESTRICT甚至可能有意义,因为这意味着您不会在管理员中没有被警告的情况下意外删除任何相关对象。

在您的情况下,似乎您可能设置了Django不知道的外键约束 - 或者您可能尝试通过原始SQL删除;我无法从你的问题中说出来。

如果问题是您无法从管理员或ORM中删除,则需要确保正确定义了模型。 django将负责收集相关对象并执行级联。

如果问题是删除不适用于原始SQL,那么您将需要首先手动删除相关对象,或者放宽SQL约束 - 在这种情况下,将其更改为级联可能是正确的解决方案

答案 1 :(得分:2)

似乎Django 1.3.1由于某种原因无法将ON DELETE CASCADE属性应用于表。它可能与在Windows上运行的MySQL-python 1.2.3接口有关。解决此问题的唯一方法是通过custom SQL

答案 2 :(得分:1)

Django默认情况下会级联。我不太确定你为什么要获得ON DELETE RESTRICT。 Django 1.3确实允许你选择备用的ON DELETE过程(在定义字段时使用on_delete kwarg),如果你继承了代码库,有人可能先做过,然后从代码中删除它,但是忽略了更新数据库。

我建议手动更改列以将其设置回ON DELETE CASCADE。然后继续前进。就像我说的,这是开发人员必须告诉Django不要做的事情;它默认级联。