2016-03-03 73 views
6

models.py文件包含:Django的on_delete = models.CASCADE具有在SQL级别没有影响

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>我没有看到任何东西,上面写着 “ON DELETE CASCADE =”

但是,当我输入python manage.py migrate时,迁移没有失败。现在,如果我去mysql表(使用SequelPro),并尝试删除当前有会话条目的用户的一行,我得到以下错误:“一行未删除。重新加载表中确认内容没有变化检查控制台在此表主键内的可能的错误!“。

现在,当我进入会话表并删除此用户的会话,然后尝试从用户表中删除用户的行时,它会正确删除。这表示ON DELETE = CASCADE实际上并不在MySQL级别上工作。

我该如何纠正它?

回答

13

docs(重点煤矿):

ForeignKey.on_delete

When an object referenced by a ForeignKey is deleted, Django will emulate the behavior of the SQL constraint specified by the on_delete argument.

Django不实际设置数据库中的ON DELETE条款。如果您需要,可以使用RunSQL操作手动添加一个。请务必使用相同的索引名称,或保留原始索引,否则稍后可能会遇到错误。

+7

这就是这样一个无赖:( –