有些项目不能从我的 Django sqlite3 数据库中删除或编辑。尝试删除这些项目时,我收到 integrity error: foreign key constraint failed.
令人沮丧的是,我的数据库中的大多数项目并非如此。我相信它只会影响几行,我必须在对模型进行一些调整之前创建这些行。我不记得我对 models.py
做了什么确切的更改文件,但我不认为这有什么过激的。我没有关于我所做的迁移的信息,因为我删除了这些文件,认为它可能会解决问题。
我已经包含了一个示例,说明 models.py
中的类如何目前正在设置。没有什么复杂的标准模型,带有简单的外键,甚至不是必需的字段。
我尝试编辑我的迁移文件,完全删除我的迁移历史记录,通过 models.py
编辑模型.models.py
:
class ExampleOne(models.Models):
title = model.CharField(max_length=500, null=True, blank=True)
class ExampleTwo(models.Models):
title = model.CharField(max_length=500, null=True, blank=True)
example_one = models.ForeignKey(ExampleOne, null=True, blank=True, on_delete=models.CASCADE)
我宁愿不删除我的数据库文件。我将能够删除 exampleone 和 exampletwo 的这些实例,但是当我尝试删除在调整模型文件之前创建的任何项目时,出现错误:
django.db.utils.IntegrityError: FOREIGN KEY constraint failed
最佳答案
这是因为您缺少 ForeignKey 中的 on_delete,它在新的 Django 版本中是必需的。
将以下 on_delete 添加到您的应用程序并进行迁移并再次迁移。那么应该没问题。
来自文档:https://docs.djangoproject.com/en/2.2/ref/models/fields/#arguments
ForeignKey 接受定义关系如何工作的细节的其他参数。
ForeignKey.on_delete
当 ForeignKey 引用的对象被删除时,Django 将模拟由 on_delete 参数指定的 SQL 约束的行为。例如,如果您有一个可以为 null 的 ForeignKey 并且您希望在删除引用的对象时将其设置为 null:
user = models.ForeignKey(
User,
models.SET_NULL,
blank=True,
null=True,
)
on_delete 不会在数据库中创建 SQL 约束。稍后可能会实现对数据库级级联选项的支持。
on_delete 的可能值可以在 django.db.models 中找到:
级联
级联删除。 Django 模拟 SQL 约束 ON DELETE CASCADE 的行为,并删除包含 ForeignKey 的对象。
Model.delete() 不会在相关模型上调用,但会为所有已删除的对象发送 pre_delete 和 post_delete 信号。
保护
通过引发 ProtectedError(django.db.IntegrityError 的子类)来防止删除引用的对象。
SET_NULL
设置外键为空;这只有在 null 为 True 时才有可能。
默认设置
将 ForeignKey 设置为其默认值;必须设置 ForeignKey 的默认值。
放()
将 ForeignKey 设置为传递给 SET() 的值,或者如果传入可调用对象,则为调用它的结果。在大多数情况下,需要传递一个可调用对象以避免在导入 models.py 时执行查询:
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
def get_sentinel_user():
return get_user_model().objects.get_or_create(username='deleted')[0]
class MyModel(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET(get_sentinel_user),
)
没做什么
不采取行动。如果您的数据库后端强制执行参照完整性,则除非您手动向数据库字段添加 SQL ON DELETE 约束,否则这将导致 IntegrityError。
关于python - 无法从 Django sqlite3 数据库中删除项目,错误为 "foreign key constraint failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55900209/