删除 2 个作为外键相互引用的模型不同对象
Posted
技术标签:
【中文标题】删除 2 个作为外键相互引用的模型不同对象【英文标题】:Delete 2 model different objects which reference each other as foreign keys 【发布时间】:2022-01-08 05:59:05 【问题描述】:我们有两个 Django 模型:
class Project(models.Model):
project_title = models.CharField(max_length=30)
owner = models.ForeignKey(User, null=True, on_delete=models.DO_NOTHING)
class User(models.Model):
usernmae = models.CharField(max_length=50)
active_project = models.ForeignKey(User, null=True, on_delete=models.DO_NOTHING, related_name='current_project')
我有一个有对象的用户(id
说692
)。该用户使用id=12345
创建了一个项目,因此这些owner
字段将获得此特定引用。
我想删除那个用户。但它显示错误
delete on table "app_user" violates foreign key constraint
这应该是on_delete=models.DO_NOTHING
,已设置。我发现的一种方法是使用on_delete=models.CASCADE
。
问题:我应该如何在不更改模型定义的情况下删除用户 (692
)(必须重新运行迁移)?
通过首先删除项目手动执行此操作会导致相同的foreign-key
错误,因为owner
字段是User
对象。
删除时如何处理这种相互的外键关系,因为删除这两者中的任何一个都会引发外键异常?
更新
模型定义中的一些更正username
是字段名称而不是usernmae
(错字)。项目的外键是Project
而不是User
模型。
class Project(models.Model):
project_title = models.CharField(max_length=30)
owner = models.ForeignKey(User, null=True, on_delete=models.DO_NOTHING)
class User(models.Model):
username = models.CharField(max_length=50)
active_project = models.ForeignKey(Project, null=True, on_delete=models.DO_NOTHING, related_name='current_project')
【问题讨论】:
可能最好的方法是在事务中执行此操作。另一种方法可能是首先将两个ForeignKey
s 之一设置为NULL
。
在课堂上USER
真的是usernmae
而不是username
吗?更重要的是为什么active_project
在User
而不是Project
上有一个FK?添加答案以更新您的问题。
【参考方案1】:
如果您真的不想进行迁移(任何特定原因?),并且这次您可以手动执行此操作。那么你有两个选择:
-
进入管理面板并手动将
project
实例中的User
字段更改为其他用户或NULL。现在您应该可以删除 User
实例了,因为它不再被引用到项目中。
如果可行,您也可以删除项目实例。
如果这行得通,请告诉我!
【讨论】:
以上是关于删除 2 个作为外键相互引用的模型不同对象的主要内容,如果未能解决你的问题,请参考以下文章