You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何将模型字段数据迁移至另一个字段且不丢失数据

Django视频模型description字段从CharField转TextField无数据丢失操作方法

方案一:直接修改自动迁移(适合开发环境、小体量项目)

主流数据库(MySQL、PostgreSQL、SQLite)都原生支持CharField到TextField的类型转换,正常操作不会丢失存量数据,步骤很简单:

  • 直接修改models.py里Video模型的字段定义
    原有代码参考:
    class Video(models.Model):
        # 其余业务字段省略
        description = models.CharField(max_length=500)  # 原CharField配置
    
    替换为TextField配置:
    class Video(models.Model):
        # 其余业务字段省略
        description = models.TextField()
    
  • 生成迁移文件
    python manage.py makemigrations
    
    终端会提示生成对应迁移文件,日志里标注Alter 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重命名为description
    class Video(models.Model):
        # 其余业务字段省略
        description = models.TextField(null=True, blank=True)
    
  • 生成最后一次迁移
    python manage.py makemigrations
    
    这时候终端会弹出提示:检测到你删除了description_tmp、新增了同名类型的description字段,询问是不是要做字段重命名,直接输入y确认即可。
  • 执行迁移完成替换
    python manage.py migrate
    
    最后可以根据业务需求调整TextField的null、blank参数,重新生成迁移即可。

内容的提问来源于stack exchange,提问作者Marcus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:12:25