简体   繁体   English

Django不接受ON DELETE CASCADE

[英]Django does not honor ON DELETE CASCADE

This is my model: 这是我的模型:

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

This is the generated SQL, according to sqlmigrate (and to manual inspection of the database): 这是根据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`);

I was expecting something like 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;

With the ON DELETE CASCADE . ON DELETE CASCADE

MySql ( MariaDB actually) complains when I delete: 我删除时, MySql (实际上是MariaDB )抱怨:

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

Which makes sense since there is no ON DELETE CASCADE clause. 这是有道理的,因为没有ON DELETE CASCADE子句。

Why is Django 2.1.5 not honoring the ON DELETE CASCADE clause? 为什么Django 2.1.5不遵守ON DELETE CASCADE子句?

From the docs : 文档

on_delete doesn't create a SQL constraint in the database. on_delete不会在数据库中创建SQL约束。 Support for database-level cascade options may be implemented later 对数据库级级联选项的支持可能会在以后实现

It will perform the cascade in Django itself, so if you delete a Tenant object using Django delete() your Subscriber object will also be deleted. 它将在Django本身中执行级联,因此,如果您使用Django delete()删除Tenant对象,则您的Subscriber对象也将被删除。 But not if you do it in SQL. 但是,如果您使用SQL进行操作,则不会。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM