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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:29:54