Python 由于FK,无法删除模型的某些实例
Python 3.6和Django 1.11.7 我有两个模型,如下所示:Python 由于FK,无法删除模型的某些实例,python,django,Python,Django,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的信息。但是当我试图删除用户模型u
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>]>)
但还是有同样的例外。我的操作中可能出现了什么错误?您正在对相关对象使用保护子句:
on_delete=models.PROTECT
您可以在以下文档中查看:
你在这里指出:
保护[来源]
通过引发ProtectedError(django.db.IntegrityError的子类)来防止删除引用的对象。您正在对相关对象使用protect子句:
on_delete=models.PROTECT
您可以在以下文档中查看:
你在这里指出:
保护[来源]
通过引发ProtectedError(django.db.IntegrityError的子类)来防止删除引用对象。删除您的
用户
字段上的。然后运行manage.py makemigrations
ForeignKey
字段对于on\u delete
参数具有默认值CASCADE
。这意味着删除用户对象将级联并删除链接到该用户的userinfo对象
看起来这就是你想要的行为
您可以在文档中阅读更多关于此的信息
另请注意,尽管删除上的有一个默认值为CASCADE
,但Django 2.0将需要此参数。删除删除=模型上的。保护用户
字段上的。然后运行manage.py makemigrations
ForeignKey
字段对于on\u delete
参数具有默认值CASCADE
。这意味着删除用户对象将级联并删除链接到该用户的userinfo对象
看起来这就是你想要的行为
您可以在文档中阅读更多关于此的信息
另请注意,尽管删除上的有一个默认值为CASCADE
,但Django 2.0将需要此参数。删除=模型。导致此问题的原因是保护。如果要删除用户,请删除此参数。默认值为CASCADE
,这意味着如果删除用户,它也将删除通过删除模型链接到我理解的用户的UserInfo
对象。PROTECT
可以解决此问题,但我们的项目要求这是PROTECT
。这并不是每次我试图删除一个用户时都会发生的。为什么会发生这种情况?如果您尝试删除没有链接到UserInfo
对象的用户
,则会出现异常。如果要删除User
对象,但保留UserInfo
对象,请更改为on\u delete=models.SET\u NULL
。虽然这可能不起作用,因为您使用户字段primary\u key=True
在尝试删除user
对象之前,我已经删除了相关的UserInfo
,但仍然得到了ProtectedError
。我甚至检查了数据库,以确保info
对象已经消失。on_delete=models.PROTECT
导致了这一情况。如果要删除用户,请删除此参数。默认值为CASCADE
,这意味着如果删除用户,它也将删除通过删除模型链接到我理解的用户的UserInfo
对象。PROTECT
可以解决此问题,但我们的项目要求这是PROTECT
。这并不是每次我试图删除一个用户时都会发生的。为什么会发生这种情况?如果您尝试删除没有链接到UserInfo
对象的用户
,则会出现异常。如果要删除User
对象,但保留UserInfo
对象,请更改为on\u delete=models.SET\u NULL
。虽然这可能不起作用,因为您使用户字段primary\u key=True
在尝试删除user
对象之前,我已经删除了相关的UserInfo
,但仍然得到了ProtectedError
。我甚至检查了数据库,以确保info
对象已经消失。