删除 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')

我有一个有对象的用户(id692)。该用户使用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')

【问题讨论】:

可能最好的方法是在事务中执行此操作。另一种方法可能是首先将两个ForeignKeys 之一设置为NULL 在课堂上USER真的是usernmae而不是username吗?更重要的是为什么active_projectUser 而不是Project 上有一个FK?添加答案以更新您的问题。 【参考方案1】:

如果您真的不想进行迁移(任何特定原因?),并且这次您可以手动执行此操作。那么你有两个选择:

    进入管理面板并手动将project 实例中的User 字段更改为其他用户或NULL。现在您应该可以删除 User 实例了,因为它不再被引用到项目中。 如果可行,您也可以删除项目实例。

如果这行得通,请告诉我!

【讨论】:

以上是关于删除 2 个作为外键相互引用的模型不同对象的主要内容,如果未能解决你的问题,请参考以下文章

55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解

使用实体框架,如何在两个模型上添加外键以相互引用

是否可以在 Laravel 的不同数据库中引用外键?

如何删除引用到对象的所有嵌套对象?

在搜索字段中正确使用外键引用,Django admin

如何在不同的数据库中使用带有外键的 django 模型?