Django on_delete = models.CASCADE在SQL级别没有任何影响

时间:2016-03-03 18:47:00

标签: python mysql django cascade cascading-deletes

我的models.py文件包含:

class User(models.Model):
    email = models.CharField(max_length=100, unique=True)
    password = models.CharField(max_length=100)
    create_time = models.DateTimeField(auto_now_add=True)

class Session(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    token = models.CharField(max_length=100, unique=True)

当我命令python manage.py makemigrations然后命令python manage.py sqlmigrate <app_name> <migration_name>时,我看不到任何说“&#34; ON DELETE = CASCADE&#34;

但是,当我键入python manage.py migrate时,迁移工作没有失败。

现在,如果我转到mysql表(使用SequelPro)并尝试为当前有会话条目的用户删除一行,我会收到以下错误:&#34; 一行没被删除。重新加载表格以确保内容在此期间未发生变化。检查控制台是否存在此表主键内可能存在的错误! &#34;。

现在,当我转到会话表并删除该用户的会话,然后尝试从用户表中删除用户的行时,它会正确删除。这表明ON DELETE = CASCADE实际上并没有在MySQL级别工作。

我该如何纠正?

1 个答案:

答案 0 :(得分:17)

来自docs(强调我的):

  

ForeignKey.on_delete

     

当删除ForeignKey引用的对象时,Django会   模拟 on_delete指定的SQL约束的行为   参数。

Django实际上并没有在数据库中设置ON DELETE子句。如果需要,可以使用RunSQL操作手动添加一个。请确保使用相同的索引名称,或保留原始索引,否则稍后可能会遇到错误。