【问题标题】:Delete 2 model different objects which reference each other as foreign keys删除 2 个作为外键相互引用的模型不同对象
【发布时间】: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?添加答案以更新您的问题。

标签: python django database postgresql foreign-keys


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-12-26
    • 2021-12-13
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多