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

时间:2018-07-08 14:29:14

标签: 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)

最近我不得不通过将related_userForeignKey更改为UserTypeA来更改UserTypeB字段。

当然,当我尝试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".

进行这些更改的最安全方法是什么?目前,我正在开发中,因此很高兴删除我的数据/迁移/所有内容,但是我认为在生产中这将很困难。

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

1 个答案:

答案 0 :(得分:1)

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

  • 删除related_user字段
  • 产生迁移
  • 添加related_user字段
  • 产生迁徙

如果您想做些更复杂的事情(根据UserTypeB填充UserTypeA,请按照以下步骤操作

  • 添加realted_user_b字段,默认为空
  • 生成迁移文件
  • 编写一个基于当前数据docs填充realted_user_b的数据迁移文件
  • 删除realted_user字段
  • 生成迁移文件
  • realted_user_b重命名为realted_user
  • 生成迁移文件