Django 不尊重 ON DELETE CASCADE

vol*_*gas 2 python mysql sql django mariadb

这是我的模型:

class Subscriber(models.Model):
    ...
    tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE, null=True)
    ...
Run Code Online (Sandbox Code Playgroud)

这是生成的 SQL,根据sqlmigrate(以及对数据库的手动检查):

ALTER TABLE `myapp_subscriber` ADD CONSTRAINT `myapp_subscriber_tenant_id_b52815ee_fk_myapp_tenant_id` FOREIGN KEY (`tenant_id`) REFERENCES `myapp_tenant` (`id`);
Run Code Online (Sandbox Code Playgroud)

我期待像这样

CREATE TABLE child (
    id INT,
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON DELETE CASCADE
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)

随着ON DELETE CASCADE.

MySqlMariaDB实际上)在我删除时抱怨:

SQL Error (1451): Cannot delete or update a parent row: a foreign key constraint fails
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为没有 ON DELETE CASCADE条款。

为什么Django 2.1.5不遵守ON DELETE CASCADE条款?

dir*_*ten 6

文档

on_delete不会在数据库中创建 SQL 约束。稍后可能会实现对数据库级级联选项的支持

它将在 Django 本身中执行级联,因此如果您Tenant使用 Django删除对象,delete()您的Subscriber对象也将被删除。但是,如果您在 SQL 中执行此操作,则不会。

  • 如果我想在 SQL 级别执行此操作,我有哪些选择? (2认同)