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

Django:将UUID字段改为外键时如何通过单次迁移保留数据?

Django中Car模型brand_id字段转ForeignKey并保留数据的单次迁移方案

模型修改

先更新models.py里的模型定义:

import uuid
from django.db import models

class Brand(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=255)  # CharField必须指定max_length,补上这个参数

class Car(models.Model):
    # 替换原UUIDField为ForeignKey,用db_column复用原有数据库列名
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, db_column='brand_id')

生成并调整迁移文件

  1. 执行命令生成迁移文件:
python manage.py makemigrations --name convert_brand_id_to_fk
  1. 打开生成的迁移文件(路径类似your_app/migrations/00xx_convert_brand_id_to_fk.py),默认的迁移操作会删除旧字段再新增外键,直接修改操作列表为:
from django.db import migrations, models
import uuid
import django.db.models.deletion

class Migration(migrations.Migration):

    dependencies = [
        # 这里填你应用的上一次迁移文件名,比如('your_app', '0001_initial')
    ]

    operations = [
        # 确保Brand的主键是UUID(如果之前Brand用的是默认整数主键,这步必须加)
        migrations.AlterField(
            model_name='brand',
            name='id',
            field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True),
        ),
        # 直接修改Car的字段类型为ForeignKey,复用原有brand_id列
        migrations.AlterField(
            model_name='car',
            name='brand',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='your_app.Brand', db_column='brand_id'),
        ),
    ]

执行迁移

最后跑迁移命令完成修改:

python manage.py migrate

核心注意点

  • db_column='brand_id'是关键:让新的ForeignKey直接使用原来的数据库列,不会删除旧数据
  • 必须保证Car表中已有的brand_id值,全部能对应到Brand表中存在的UUID主键,不然迁移时会触发数据库约束错误
  • 如果之前Brand用的是默认的整数主键,得先确保Brand表中已经把主键改成UUID,并且所有Car的brand_id都匹配Brand的UUID值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:52:30