Django如何修改继承的模型字段默认值并完成存量数据迁移
实现步骤
第一步:覆盖Child模型的foo字段定义
因为foo字段是从Parent继承的,你需要在Child类中显式声明该字段,覆盖父类的默认值配置,代码示例如下:
from django.db import models class Parent(models.Model): foo = models.BooleanField(default=True) # 其余Parent字段定义 class Meta: # 如果是抽象基类继承保留该配置,多表继承可删除 abstract = True class Child(Parent): # 显式覆盖父类的foo字段,修改默认值为False foo = models.BooleanField(default=False) # 其余Child字段定义
注意:无论你用的是Django抽象基类继承还是多表继承,该覆盖规则都生效,且不会影响Parent本身或其他继承自Parent的子类的foo字段配置。
第二步:生成初始迁移文件
执行Django迁移生成命令:python manage.py makemigrations
这一步Django会自动生成一个修改Child表foo字段默认值的迁移文件,但该迁移只会对后续新创建的对象生效,不会修改已有数据。
第三步:修改迁移文件添加旧数据更新逻辑
手动打开刚生成的迁移文件,添加RunPython操作批量更新现有Child对象的foo值,修改后的迁移文件结构示例:
from django.db import migrations, models def update_child_foo_value(apps, schema_editor): # 此处用迁移上下文获取模型,不要直接import项目中的Child模型 Child = apps.get_model('你的应用名称', 'Child') Child.objects.all().update(foo=False) class Migration(migrations.Migration): dependencies = [ ('你的应用名称', '上一个迁移文件的文件名前缀'), ] operations = [ migrations.AlterField( model_name='child', name='foo', field=models.BooleanField(default=False), ), # 新增该操作执行旧数据更新 migrations.RunPython(update_child_foo_value), ]
第四步:执行迁移
运行迁移命令完成所有配置:python manage.py migrate
效果验证
- 后续新创建的Child对象,不手动指定foo值时默认值为False
- 迁移执行前已存在的所有Child对象的foo值都会被批量修改为False
- Parent类本身、其他继承自Parent的子类的foo字段默认值仍保持为True,不受本次修改影响
内容的提问来源于stack exchange,提问作者michaelsnowden
相关产品推荐
相关产品推荐

