我的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/