11

我只需要您的 Django 专家确认我对Django 的 ON DELETE CASCADE 实现的理解。

根据 Django 官方文档:

当 Django 删除一个对象时,默认情况下它会模拟 SQL 约束 ON DELETE CASCADE 的行为——换句话说,任何具有指向要删除的对象的外键的对象都将与它一起被删除。

“模拟”这个词是否暗示 ON DELETE CASCADE 逻辑实际上是在 Django 中实现的,而不是在数据库级别?(我查看了我的数据库,所有包含外键的表的定义中都有ON DELETE NO ACTION。)

如果我的理解是正确的,有什么方法可以将ON DELETE CASCADE逻辑从应用层重新定位到数据库层?我更多的是寻找一种正确的方法,而不是黑客来做这件事。(注意:我使用 PostgreSQL 作为我的后端。)

4

2 回答 2

8

如果您询问相关代码在哪里实现:您可以在此处找到。

在应用程序/ORM 层中实现 CASCADE-DELETE 逻辑是有意义的,因为这使应用程序能够在删除发生时得到通知(例如,Django 的删除信号会为已删除的实例触发),此外,这是一种在整个应用程序中启用此功能的明智方法不同类型的数据库。

如果您担心数据的完整性:如果您的数据库支持,Django 仍然设置外键约束(例如检查 Postgresql)。因此,您的数据库不会让您删除外键指向的任何行。

自己试试:

> DELETE FROM accounts_publisher WHERE id=5;
ERROR:  update or delete on table "accounts_publisher" violates foreign key constraint "accounts_publisher_id_411559b18a178e73_fk_accounts_publisher_id" on table "accounts_membership"
DETAIL:  Key (id)=(5) is still referenced from table "accounts_membership".
于 2015-03-23T10:28:56.377 回答
-1

仅供参考,这从 django 1.3 开始就可以配置: https ://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ForeignKey.on_delete

基本上您需要将 on_delete 设置为 DO_NOTHING 并自己将级联逻辑添加到数据库中:

DO_NOTHING:不采取任何行动。如果您的数据库后端强制执行引用完整性,这将导致 IntegrityError,除非您手动将 SQL ON DELETE 约束添加到数据库字段(可能使用初始 sql)。

于 2013-12-07T12:01:23.040 回答