Django生产环境下为存量模型添加整数主键的迁移问题
解决Django存量数据主键替换问题
步骤1:先新增临时字段,不修改原主键
不要直接改动原CharField的主键标记,先添加新的AutoField字段但暂不设为主键:
# models.py class YourModel(models.Model): original_char_pk = models.CharField(max_length=50, primary_key=True) # 新增字段,允许为空,暂不设为主键 id = models.AutoField(null=True) # 其他原有字段...
生成并执行迁移:
./manage.py makemigrations ./manage.py migrate
这一步会给存量数据的id字段填充NULL,不会触发默认值要求。
步骤2:手动为存量数据填充唯一id值
通过Django Shell给每条记录的id赋值唯一整数:
./manage.py shell
在Shell中执行填充逻辑:
from your_app.models import YourModel for idx, obj in enumerate(YourModel.objects.all(), start=1): obj.id = idx obj.save(update_fields=['id'])
步骤3:修改模型,切换主键设置
更新models.py,将新字段设为主键,同时取消原字段的主键标记(如需保留唯一性可加unique=True):
# models.py class YourModel(models.Model): original_char_pk = models.CharField(max_length=50, primary_key=False, unique=True) id = models.AutoField(primary_key=True) # 其他原有字段...
步骤4:生成迁移并手动调整文件
生成新的迁移文件:
./manage.py makemigrations --name update_primary_key
打开生成的迁移文件(路径类似your_app/migrations/00XX_update_primary_key.py),删除自动生成的默认值相关代码,调整操作逻辑为:
from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('your_app', '00XX_previous_migration'), # 替换为上一步迁移的编号 ] operations = [ migrations.AlterField( model_name='yourmodel', name='id', field=models.AutoField(primary_key=True, serialize=False), ), migrations.AlterField( model_name='yourmodel', name='original_char_pk', field=models.CharField(max_length=50, unique=True), ), ]
步骤5:执行最终迁移
./manage.py migrate
注意事项
- 操作前务必全量备份数据库,防止数据丢失
- 若原CharField被其他模型作为外键引用,需同步修改对应外键字段指向新的
id主键,这部分需额外编写迁移逻辑 - 填充
id时确保数值唯一,避免重复冲突
内容的提问来源于stack exchange,提问作者ackermann.app
相关产品推荐
相关产品推荐

