Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由于FK,无法删除模型的某些实例_Python_Django - Fatal编程技术网

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

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

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>]>)

但还是有同样的例外。我的操作中可能出现了什么错误?

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

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
对象已经消失。