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

Rak*_*kib 19 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)
Run Code Online (Sandbox Code Playgroud)

当我命令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级别工作.

我怎么能纠正它?

knb*_*nbk 21

文档(强调我的):

ForeignKey.on_delete

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

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

  • 这是一个无赖:( (18认同)