FOREIGN KEY 约束因模型而失败。DO_NOTHING

问题描述 投票:0回答:2

我有这个 models.py 的代码片段

class Provider(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
    provider = models.CharField(max_length=100, unique=True)
    active = models.BooleanField(default=True)

当我尝试删除一个对象时,我遇到一个错误:

django.db.utils.IntegrityError:外键约束失败

我在 django 2.x 上遇到了这个问题,因为在 1.11 上一切都很完美。 我做了一些搜索,发现这个问题可能会在这部分发生

on_delete=models.DO_NOTHING
,那么我怎样才能在保持一切原样的情况下解决它呢?

django python-3.x django-2.0
2个回答
3
投票

基本上,你是在告诉 Django 在删除用户时不执行任何操作。因此,您将尝试删除具有相关外键的行,这是预期的行为。 如果您想在用户被删除时保留提供者模型,则必须使用户可为空并使用 models.SET_NULL。 如果提供者在你的逻辑中没有意义,你可以级联。 如果您需要重新分配给默认用户,您可以使用自定义方法。


0
投票

Django 在 2.0.0 版本中删除了默认的

ForeignKey.on_delete
。在此之前,默认值为
CASCADE
,在您的示例中,它会自动删除引用已删除用户的
Provider
实例。

Django 1.11 中的

ForeignKey.on_delete 指出:

自 1.9 版本起已弃用:

on_delete
将成为 Django 2.0 中的必需参数。在旧版本中,它默认为
CASCAD

因此,要获得旧的行为,您必须将

on_delete
设置为
CASCADE

© www.soinside.com 2019 - 2024. All rights reserved.