Python Django-将更改迁移到关系字段时终端中的IntegrityError

Python Django-将更改迁移到关系字段时终端中的IntegrityError,python,django,Python,Django,我有一个像下面这样的Django模型 class ExampleModel(models.Model): name = models.CharField(...) related_user = models.ForeignKey(UserTypeA, related_name='related_example', blank=True, null=True, on_delete=models.SET_NULL) 我最近不得不通过将ForeignKey从UserTypeA更改为U

我有一个像下面这样的Django模型

class ExampleModel(models.Model):
    name = models.CharField(...)
    related_user = models.ForeignKey(UserTypeA, related_name='related_example', blank=True, null=True, on_delete=models.SET_NULL)
我最近不得不通过将
ForeignKey
UserTypeA
更改为
UserTypeB
来更改
related\u user
字段

当然,当我尝试
python manage.py makemigration
时,这会在终端中引发一个错误

django.db.utils.IntegrityError: insert or update on table "models_examplemodel" violates foreign key constraint "models_examplemodel_related_user_id_ac0c6018_fk_accounts_"
DETAIL:  Key (related_user_id)=(13) is not present in table "accounts_usertypea".
进行这些更改最安全的方法是什么?目前我正在开发中,所以我很乐意删除我的数据/迁移/任何东西,但我想在生产中这会很困难


我想在这里看到的理想行为是刚刚被删除的
ExampleModel
UserTypeA
之间的关系,因此当前关系将设置为
NULL
。想法?

如果您只想删除
UserTypeA
并将
UserTypeB
None
值一起使用,只需执行以下操作:

  • 删除
    相关用户
    字段
  • 生成迁移
  • 添加
    相关用户
    字段
  • 生成混合
如果您想做更复杂的事情(根据
UserTypeA
填写
UserTypeB
),以下是步骤

  • 添加
    实时用户\u b
    字段,默认为空
  • 生成迁移文件
  • 编写一个数据迁移文件,根据当前数据填充
    realted\u user\b
  • 删除
    realted\u用户
    字段
  • 生成迁移文件
  • realted\u user\u b
    重命名为
    realted\u user
  • 生成迁移文件

如果您只想删除
UserTypeA
并将
UserTypeB
None
值一起使用,只需执行以下操作:

  • 删除
    相关用户
    字段
  • 生成迁移
  • 添加
    相关用户
    字段
  • 生成混合
如果您想做更复杂的事情(根据
UserTypeA
填写
UserTypeB
),以下是步骤

  • 添加
    实时用户\u b
    字段,默认为空
  • 生成迁移文件
  • 编写一个数据迁移文件,根据当前数据填充
    realted\u user\b
  • 删除
    realted\u用户
    字段
  • 生成迁移文件
  • realted\u user\u b
    重命名为
    realted\u user
  • 生成迁移文件

看起来在将表UserTypeA的关系更新为UserTypeB之前,ExampleModel表中已经有了数据。在这种情况下,完整性错误是绝对正确的。表中已经存在的数据可能有一些键或外键关系,这些键或外键关系无法与新表进行映射(或在新映射的表中不存在)。@AnkitJaiswal确实,我预期会发生完整性错误,因此想知道是否有任何方法可以改变此默认行为?i、 e.我会写一个脚本来解决生产中的这类问题吗?看起来,在将表UserTypeA更新为UserTypeB之前,ExampleModel表中已经有了数据。在这种情况下,完整性错误是绝对正确的。表中已经存在的数据可能有一些键或外键关系,这些键或外键关系无法与新表进行映射(或在新映射的表中不存在)。@AnkitJaiswal确实,我预期会发生完整性错误,因此想知道是否有任何方法可以改变此默认行为?i、 e.我会写一个脚本来解决生产中的此类问题吗?我尝试了第一个选项,但删除字段后进行迁移仍然会产生相同的错误,不幸的是,您必须先删除字段,然后生成迁移文件,然后添加新字段,然后再次生成最终迁移文件。如果您只是更新字段并生成迁移文件,django认为您已经更新了字段(不删除旧列)。但是旧列可能包含无效数据,因此按照我所说的操作(生成2个迁移文件),您会强制django删除旧列仍然会遇到相同的错误。很遗憾,我是否应该删除一些迁移文件?修复了它!除了我必须删除到(包括)的所有最新迁移文件之外,这一切都有效迁移停止工作的点我尝试了第一个选项,但删除字段后迁移仍会生成相同的错误不幸的是,您必须先删除字段,然后生成迁移文件,然后添加新字段,然后再次生成最终迁移文件。如果您只是更新字段并生成迁移文件,django认为您已经更新了字段(不删除旧列)。但是旧列可能包含无效数据,因此按照我所说的操作(生成2个迁移文件),您会强制django删除旧列仍然会遇到相同的错误。很遗憾,我是否应该删除一些迁移文件?修复了它!这是有效的,只是我必须删除所有最近的迁移文件,直到(包括)迁移停止工作为止