python - Django on_delete=models.CASCADE 在 SQL 级别没有效果

标签 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>我没有看到任何说“ON DELETE=CASCADE”的内容

但是,当我键入 python manage.py migrate 时,迁移不会失败。 .

现在,如果我转到 mysql 表(使用 SequelPro)并尝试为当前具有 session 条目的用户删除一行,我会收到以下错误:“未删除一行. 重新加载表以确保其内容在此期间没有更改。检查控制台以查看此表的主键中可能存在的错误!"。

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

如何改正?

最佳答案

来自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 手动添加一个手术。请务必使用相同的索引名称,或保留原始索引,否则稍后可能会出错。

关于python - Django on_delete=models.CASCADE 在 SQL 级别没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35780443/

相关文章:

python - 从另一个字典的值创建 python 字典?

mysql - 从任务数据库设计中赚取xp点

mysql忽略在哪里?

php - mysql_insert_id();成功插入行后未返回值

django - 在管理站点中创建一个隐藏字段

django - 将 django 应用程序部署到 heroku - 找不到文件

python - PyCharm 中未使用的错误导入语句?

python - Flask 和 PyJWT 检索授权 header

python - 需要此正则表达式的帮助

javascript - 整个站点使用一个 Django Channels websocket 消费者?