在Django中实现的ON DELETE CASCADE逻辑在哪里?(使用PostgreSQL)

tam*_*are 9 django django-database

我只需要确认一下Django专家对Django实现ON DELETE CASCADE的理解.

根据官方Django文档:

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

"模拟"一词是否意味着ON DELETE CASCADE逻辑实际上是在Django而不是在数据库级别实现的?(我查看了我的数据库,所有包含外键的表在其定义中都有ON DELETE NO ACTION.)

如果我的理解是正确的,有什么办法可以将ON DELETE CASCADE逻辑从app层重新定位到数据库层?我正在寻找一种正确的方式,而不是黑客.(注意:我使用PostgreSQL作为我的后端.)

Ber*_*ant 7

如果您询问相关代码的实现位置:您可以在此处找到它.

在应用程序/ 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".
Run Code Online (Sandbox Code Playgroud)

  • 我想补充说,#21961(https://code.djangoproject.com/ticket/21961)正在跟踪数据库级别级联支持 (3认同)
  • @tamakisquare和另一个原因是你的应用程序可以对被删除的实例做出反应(例如使用`pre_delete` /`post_delete`)信号...... (3认同)
  • 伯恩哈德 - 这个问题大约四年前就​​被问到了。从那时起,我的 django 应用程序一直运行良好,在 ORM 层中使用 CASCADE-DELETE 登录,所以显然我关心的不是数据完整性。这更多是一个关于为什么要为复制数据库层中已经可用的逻辑付费(考虑到性能和可能的锁定情况)的问题。正如您提到的,我同意与数据库无关可能是核心团队做出这一决定的一个重要原因。 (2认同)