Django不接受ON DELETE CASCADE

时间:2019-02-18 16:22:45

标签: python mysql sql django mariadb

这是我的模特

class Subscriber(models.Model):
    ...
    tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE, null=True)
    ...

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

ALTER TABLE `myapp_subscriber` ADD CONSTRAINT `myapp_subscriber_tenant_id_b52815ee_fk_myapp_tenant_id` FOREIGN KEY (`tenant_id`) REFERENCES `myapp_tenant` (`id`);

我期待的是类似this的东西:

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;

使用ON DELETE CASCADE

MySql(实际上是MariaDB)在删除时抱怨:

SQL Error (1451): Cannot delete or update a parent row: a foreign key constraint fails

这很有意义,因为没有ON DELETE CASCADE子句。

为什么Django 2.1.5不遵守ON DELETE CASCADE子句?

1 个答案:

答案 0 :(得分:2)

来自docs

  

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

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