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作为我的后端.)
如果您询问相关代码的实现位置:您可以在此处找到它.
在应用程序/ 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)
| 归档时间: |
|
| 查看次数: |
1608 次 |
| 最近记录: |