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

标签 python django django-models sqlite foreign-keys

有些项目无法从我的 Django sqlite3 数据库中删除或编辑。当尝试删除这些项目时,我收到完整性错误:外键约束失败。

令人沮丧的是,我的数据库中的大多数项目并非如此。我相信它只会影响几行,我必须在对模型进行一些调整之前创建这些行。我不记得我对 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 的行为,并删除包含外键的对象。

相关模型上不会调用 Model.delete(),但会为所有已删除的对象发送 pre_delete 和 post_delete 信号。

保护

通过引发 ProtectedError(django.db.IntegrityError 的子类)来防止删除引用的对象。

SET_NULL

设置外键为空;仅当 null 为 True 时,这才有可能。

设置默认值 将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),
        )

不做任何事情

不采取任何行动。如果您的数据库后端强制执行引用完整性,这将导致 IntegrityError,除非您手动向数据库字段添加 SQL ON DELETE 约束。

关于python - 无法从 Django sqlite3 数据库中删除项目,错误为 "foreign key constraint failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55900209/

相关文章:

python - 防止 Django 模型中的 DateRangeField 重叠?

python - Django REST Framework 外键 - NOT NULL 约束失败

python - 重新使用 sqlalchemy ORM 对象插入多条记录

Python C API : how to get string representation of exception?

python - curses 模块中的标准键功能

django - 从 django admin list_display 访问,一个来自一对一表的值

python - 通过telnet上传文件

python - Haystack Whoosh 拼写建议太贪婪

python - Form.save(commit=False) 在 Django 1.2.3 中表现不同?

python - Django 模型的初始数据