我正在研究一个项目,问题是我已经创建了具有简单ID列的模型,但现在我的要求已经更改,我想用UUID字段替换ID字段(模型)我刚刚更新了我的模型:
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
但是当我运行迁移时出现错误
django.db.utils.OperationalError:(1829,“不能删除列'id': 在外键约束中需要
请指导我如何执行此迁移?
答案 0 :(得分:1)
以下是您需要执行的操作列表
1 - 将新的uuid
字段添加到模型(我将此模型命名为Base
),然后生成迁移文件
uuid = models.UUIDField(default = uuid4,blank = True,null = True)
blank = null =True
2-在此步骤中,您应该使用有效数据填充uuid
字段。您应该为Base
模型编写数据迁移文件。请查看docs以获取更多信息
你的前锋方法应该是这样的:
for item in Base.objects.all():
item.uuid = uuid4()
item.save()
3-将uuid字段更改为此并生成迁移
uuid = models.UUIDField(default = uuid4,unique = True)
4 - 对于指向Base
模型的其他模型,您应该添加一个指向uuid字段的新外键
假设您对Base模型的默认关系是这样的
base = models.ForeignKey(
Base, on_delete=models.PROTECT, related_name='base'
)
你应该像这样添加一个临时字段
base_uuid = models.ForeignKey(
Base,
on_delete=models.PROTECT,
related_name='base_uuid',
to_field='uuid',
blank=True,
null=True,
)
to_field
告诉django此外键未指向默认pk
字段blank = null = True
Base
的所有foreignkeys / manytomanyfield,您应该添加此临时字段5-在此步骤中,您应该创建一个数据迁移文件
在此数据迁移文件中,您需要使用有效数据(基于旧base_uuid
字段)填充所有base
字段,您的迁移代码可能是这样的
for item in RelatedModel.objects.all():
item.base_uuid_id = item.base.uuid
base_uuid
字段都应包含有效数据 6-在所有相关模型中删除相关字段(保留新的base_uuid
字段但丢弃旧的相关字段)并生成迁移文件
7- Base
模型更改uuid字段并生成迁移文件
uuid = models.UUIDField(default = uuid4,primary_key = True)
8-在所有相关模型(已添加base_uuid
个字段的模型)中更新字段
_uuid
)relate_name
字段名称(从相关名称中删除_uuid
)blank = null = true
to_field='uuid'
参数(您不再需要它)非常重要注意:使用测试数据运行这些代码,并在对实际数据运行此代码之前从数据库创建完整备份