Django如何将模型字段数据迁移至另一个字段且不丢失数据
Django视频模型description字段从CharField转TextField无数据丢失操作方法
方案一:直接修改自动迁移(适合开发环境、小体量项目)
主流数据库(MySQL、PostgreSQL、SQLite)都原生支持CharField到TextField的类型转换,正常操作不会丢失存量数据,步骤很简单:
- 直接修改
models.py里Video模型的字段定义
原有代码参考:
替换为TextField配置:class Video(models.Model): # 其余业务字段省略 description = models.CharField(max_length=500) # 原CharField配置class Video(models.Model): # 其余业务字段省略 description = models.TextField() - 生成迁移文件
终端会提示生成对应迁移文件,日志里标注python manage.py makemigrationsAlter field description on video即为正常,这是Django识别到字段类型变更,不是删除旧字段新建字段。 - 执行迁移生效
python manage.py migrate操作前务必备份数据库,这是所有生产/非生产环境数据库操作的兜底要求。执行完成后抽查几条存量视频数据,确认description内容完整即可。
方案二:多步稳妥迁移(适合生产环境、有特殊数据库约束场景)
如果担心自动变更字段类型触发隐式约束、数据转换异常,就走最稳妥的「新增字段-同步数据-替换字段」流程,零数据丢失风险:
- 给Video模型新增临时TextField字段,先允许空值避免迁移报错,原有CharField暂时保留
class Video(models.Model): # 其余业务字段省略 description = models.CharField(max_length=500) # 旧字段暂时不动 description_tmp = models.TextField(null=True, blank=True) # 新增临时字段 - 生成并执行第一次迁移,把临时字段加到数据库表中
python manage.py makemigrations python manage.py migrate - 编写数据迁移脚本,把旧字段的存量数据全量同步到临时字段。先生成空迁移文件:
打开生成的空迁移文件,补充数据同步逻辑:python manage.py makemigrations --empty 你的视频app名称
写完执行迁移完成数据同步:from django.db import migrations def sync_description(apps, schema_editor): Video = apps.get_model('你的视频app名称', 'Video') # 批量同步数据,数据量特别大的时候可以用iterator()减少内存占用 for video in Video.objects.all().iterator(): video.description_tmp = video.description video.save(update_fields=['description_tmp']) class Migration(migrations.Migration): # 以下依赖项保留文件自动生成的内容,不要手动修改 dependencies = [ ('你的视频app名称', '上一个迁移文件的编号前缀'), ] operations = [ migrations.RunPython(sync_description), ]python manage.py migrate这一步执行完必须抽查数据,确认临时字段里的内容和旧字段完全一致,再走后续步骤。
- 修改模型,删除旧的CharField字段,把临时字段
description_tmp重命名为descriptionclass Video(models.Model): # 其余业务字段省略 description = models.TextField(null=True, blank=True) - 生成最后一次迁移
这时候终端会弹出提示:检测到你删除了python manage.py makemigrationsdescription_tmp、新增了同名类型的description字段,询问是不是要做字段重命名,直接输入y确认即可。 - 执行迁移完成替换
最后可以根据业务需求调整TextField的python manage.py migratenull、blank参数,重新生成迁移即可。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

