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')
生成并调整迁移文件
- 执行命令生成迁移文件:
python manage.py makemigrations --name convert_brand_id_to_fk
- 打开生成的迁移文件(路径类似
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
相关产品推荐
相关产品推荐

