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 中将需要此参数。