由于 FK 的原因,无法删除模型的某些实例



Python 3.6 和 Django 1.11.7。

我有两个模型如下所示:

class User():
name = models.CharField()
...
class UserInfo():
user = models.OneToOneField(User, on_delete=models.PROTECT, primary_key=True, related_name='info')

我想删除某个用户实例 A,并且显式删除了用户 A 的信息。但是当我尝试删除用户模型user.delete()时,我得到了ProtecedError

ProtectedError: ("Cannot delete some instances of model 'User' because they are referenced through a protected foreign key: 'UserInfo.user'", <QuerySet [<UserInfo: UserInfo object>]>)

然后我尝试将删除放在尝试/捕获中,如下所示:

try:
user.delete()
except ProtectedError:
UserInfo.objects.filter(user=user).delete()
user.delete()

但仍然有同样的例外。我的操作中可能出现什么问题?

您正在相关对象上使用保护子句:

on_delete=models.PROTECT

您可以在以下文档中查看它:

https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ForeignKey.on_delete

你在这里指出:

保护[来源] 通过引发 ProtectedError(django.db.IntegrityError 的一个子类(来防止删除引用的对象。

删除user字段上的on_delete=models.PROTECT。并运行manage.py makemigrations

ForeignKey字段的默认值为on_delete参数的默认值CASCADE。这意味着删除用户对象将级联并删除链接到该用户的用户信息对象。

看起来这就是您正在寻找的行为。

您可以在文档文档中阅读有关此内容的更多信息

另请注意,尽管on_delete有一个默认值 foCASCADE但从 Django 2.0 中将需要此参数。

最新更新