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

如何在Django模型中将Char字段转换为UUID字段

将Django CharField(存储UUID字符串)转换为UUIDField的步骤

直接修改字段类型容易引发数据丢失或迁移失败,稳妥的做法是分阶段完成转换:

1. 新增临时UUID字段并执行迁移

先在模型中添加一个允许为空的UUIDField:

from django.db import models
import uuid

class YourModel(models.Model):
    # 原字段:存储UUID格式字符串的CharField
    old_uuid_field = models.CharField(max_length=255)
    # 新增临时UUID字段
    new_uuid_field = models.UUIDField(null=True, blank=True)
    # 其他字段...

生成并执行初始迁移:

python manage.py makemigrations
python manage.py migrate

2. 编写数据迁移脚本

生成空迁移文件用于数据转换:

python manage.py makemigrations --empty yourappname

打开生成的迁移文件,修改为如下内容(替换对应模型和字段名):

from django.db import migrations, models
import uuid

def migrate_uuid(apps, schema_editor):
    YourModel = apps.get_model('yourappname', 'YourModel')
    for obj in YourModel.objects.all():
        # 将字符串转为UUID对象赋值给新字段
        obj.new_uuid_field = uuid.UUID(obj.old_uuid_field)
        obj.save()

class Migration(migrations.Migration):
    dependencies = [
        # 填入上一步生成的迁移文件编号,比如('yourappname', '0002_add_new_uuid_field')
        ('yourappname', '0002_add_new_uuid_field'),
    ]

    operations = [
        migrations.RunPython(migrate_uuid),
    ]

执行数据迁移:

python manage.py migrate

3. 替换原字段并完成最终迁移

修改模型,删除原CharField,将新字段重命名为原字段名(按需调整字段参数,比如是否允许为空):

from django.db import models
import uuid

class YourModel(models.Model):
    # 替换后的UUID字段
    old_uuid_field = models.UUIDField()
    # 其他字段...

生成并执行最终迁移:

python manage.py makemigrations
# 终端会提示是否重命名字段,输入yes确认
python manage.py migrate

关键注意事项

  • 提前验证原CharField中所有数据都是有效UUID格式,避免迁移报错:
    from yourapp.models import YourModel
    import uuid
    
    invalid_ids = []
    for obj in YourModel.objects.all():
        try:
            uuid.UUID(obj.old_uuid_field)
        except ValueError:
            invalid_ids.append(obj.pk)
    print("无效UUID条目ID:", invalid_ids)
    
  • 生产环境操作前务必备份数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:30:58