最近在企业级Django项目中遇到一个棘手的数据迁移问题,特来分享一下踩坑经历。
问题背景:项目从Django 3.2升级到4.2,在迁移过程中遇到了数据一致性问题。具体表现为:
- 原有模型字段需要重构,从字符串类型改为JSONField
- 需要将历史数据进行格式转换
- 多个应用间存在依赖关系
踩坑过程:
第一步:创建迁移文件
python manage.py makemigrations --empty myapp
第二步:编写复杂迁移逻辑
from django.db import migrations, models
import json
class Migration(migrations.Migration):
dependencies = [
('myapp', '0012_auto_20230101_0001'),
]
operations = [
migrations.AddField(
model_name='mytable',
name='data_json',
field=models.JSONField(default=dict), null=True),
),
migrations.RunPython(
code=convert_data,
reverse_code=reverse_convert_data
),
migrations.RemoveField(
model_name='mytable',
name='old_field'
)
]
第三步:关键数据转换函数
from django.db import transaction
def convert_data(apps, schema_editor):
MyTable = apps.get_model('myapp', 'MyTable')
for obj in MyTable.objects.all():
# 复杂的数据格式转换逻辑
if obj.old_field:
try:
obj.data_json = json.loads(obj.old_field)
except json.JSONDecodeError:
obj.data_json = {}
else:
obj.data_json = {}
obj.save(update_fields=['data_json'])
解决要点:
- 使用
RunPython处理复杂逻辑 - 注意事务控制和错误处理
- 预先备份生产数据
- 通过
update_fields优化性能
建议企业级项目中建立完善的迁移测试流程,避免线上事故。

讨论