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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:15:03