python - 无法从 Django sqlite3 数据库中删除项目,错误为 "foreign key constraint failed"

标签 python django django-models sqlite foreign-keys

有些项目不能从我的 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/

相关文章:

javascript - 400 或 500 级别的 Http 响应

python - django:解析自定义模板中的变量

python - 在 RedShift 中使用 Django 多数据库

Django 类型错误 : argument must be int or float when trying to access model

python - 使用NLTK训练自定义BIO标签

python - 如何使用node.js和Dialogflow

python - 在 Django 中使用图像字段更新记录?

python - 如何使用 python 从内联样式标签中删除特定的值对?

android - 使用 kivy - kivy 启动器在 android 上查看打印语句的输出

mysql - Django,当 99% 的列是默认值时,向表中添加列的最佳做法是什么?