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

Django迁移:将手动输入主键替换为AutoField的解决方案

可行的Django主键迁移方案(从CharField切换到AutoField)

方案一:分步迁移(保留现有数据,无需导出导入)

这个方案分三次迁移完成,避免直接修改主键引发的冲突:

步骤1:新增临时自增字段,保留原主键

先修改模型结构:

class MyObject(models.Model):
    id = models.CharField(max_length=200, primary_key=True)  # 保留原CharField主键
    temp_id = models.AutoField(null=True)  # 新增临时自增字段,允许空值
    title = models.CharField(max_length=200, blank=True)
    # 其他无关字段保持不变

执行迁移命令:

python manage.py makemigrations
python manage.py migrate

步骤2:给临时字段填充唯一自增值

打开Django Shell:

python manage.py shell

在Shell中执行代码,给现有数据的temp_id赋值连续唯一的整数:

from yourapp.models import MyObject
for idx, obj in enumerate(MyObject.objects.all(), start=1):
    obj.temp_id = idx
    obj.save()

替换yourapp为你的实际应用名称。

步骤3:调整模型字段,完成主键切换

修改模型为最终目标结构:

class MyObject(models.Model):
    id = models.AutoField(primary_key=True)  # 新的自增主键
    url = models.CharField(max_length=200)  # 存储原id的内容
    title = models.CharField(max_length=200, blank=True)
    # 其他无关字段保持不变

执行makemigrations时,系统会提示是否重命名字段:

  • 选择yes,指定将temp_id重命名为id
  • 再次选择yes,指定将原id重命名为url

最后执行迁移:

python manage.py migrate

完成后检查数据,确认url字段保留了原id的所有内容,新id为自增整数。


方案二:数据导出导入方案

如果觉得分步迁移繁琐,可以用Django自带的导出导入工具:

步骤1:导出现有数据

执行命令导出MyObject的数据到JSON文件:

python manage.py dumpdata yourapp.MyObject --indent 4 > myobject_data.json

替换yourapp为你的应用名称。

步骤2:修改模型为目标结构

直接把模型改成你想要的最终版本:

class MyObject(models.Model):
    id = models.AutoField(primary_key=True)
    url = models.CharField(max_length=200)
    title = models.CharField(max_length=200, blank=True)
    # 其他无关字段保持不变

步骤3:重置数据库表并执行新迁移

先回滚该应用的所有迁移(注意:这会清空现有表数据,确保已备份):

python manage.py migrate yourapp zero

然后生成并执行新迁移:

python manage.py makemigrations
python manage.py migrate

步骤4:修改导出的JSON文件字段

打开myobject_data.json,对每个数据对象做两处修改:

  1. 移除"pk"键(新主键由AutoField自动生成)
  2. 将字段里的"id"键名改为"url",值保留原内容

修改示例:
原数据:

{
    "model": "yourapp.myobject",
    "pk": "old_char_id_001",
    "fields": {
        "title": "示例标题"
    }
}

修改后:

{
    "model": "yourapp.myobject",
    "fields": {
        "url": "old_char_id_001",
        "title": "示例标题"
    }
}

步骤5:导入修改后的数据

执行导入命令:

python manage.py loaddata myobject_data.json

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:47:28