从Django models移除status_choice后如何更新数据库对应数据
Django模型choices移除后批量更新历史数据方案
你可以根据项目部署场景选下面两种方式处理:
生产环境推荐:编写数据迁移
这种方式会把数据更新逻辑纳入版本控制,所有环境执行迁移时都会自动完成数据修正,不会出现漏改,是Django官方推荐的做法。
- 先确认模型代码里已经删掉
STATUS元组里的FIELD_4、FIELD_5两个选项,在项目根目录执行命令生成空迁移文件:
python manage.py makemigrations --empty 你的应用名
- 打开migrations文件夹下刚生成的迁移文件,替换为如下逻辑:
from django.db import migrations def update_old_status_values(apps, schema_editor): TargetModel = apps.get_model('你的应用名', '你的模型类名') # 批量把废弃状态值更新为默认值FIELD_1 TargetModel.objects.filter(status__in=['FIELD_4', 'FIELD_5']).update(status='FIELD_1') class Migration(migrations.Migration): # dependencies项保持文件生成时的默认内容即可,不要手动修改 dependencies = [ ('你的应用名', '上一个迁移文件的编号,例如0012_xxx'), ] operations = [ migrations.RunPython(update_old_status_values), ]
注意:迁移中必须通过apps.get_model()获取模型,不能直接导入当前models里的模型类,否则后续模型迭代后,历史迁移运行会找不到对应字段报错。
- 保存文件后执行
python manage.py migrate,等待命令执行完成就完成了全量数据更新。
本地/小型项目快速处理:通过Django Shell执行更新
如果是本地开发环境、个人小项目不需要保留迁移脚本,可以直接走shell快速更新:
- 终端执行命令进入Django交互环境:
python manage.py shell
- 逐行执行以下代码:
from 你的应用名.models import 你的模型类 # 批量更新废弃状态 你的模型类.objects.filter(status__in=['FIELD_4', 'FIELD_5']).update(status='FIELD_1') # 可选:校验更新结果,返回0就代表所有旧值都处理完成 你的模型类.objects.filter(status__in=['FIELD_4', 'FIELD_5']).count()
执行完退出shell即可。
内容的提问来源于stack exchange,提问作者Bokijonov
相关产品推荐
相关产品推荐

