如何在Django中正确迁移Enumfield值?

问题描述 投票:0回答:1

假设我们有一个枚举:

class MyEnum(Enum):
    FOO = "FOO"  
    BAR = "BAR"  
    BAZ = "BAZ"

在字段中使用:

from enumfields import EnumField

    class FooModel (models.Model)   
        foo_field = EnumField(
            MyEnum, null=True, blank=True, default=MyEnum.FOO)

然后,我想删除MyEnum中的一个字段,因为我不再希望数据库中的值为FOO

class MyEnum(Enum):
    BAR = "BAR"  
    BAZ = "BAZ"
from enumfields import EnumField

    class FooModel (models.Model)   
        foo_field = EnumField(
            MyEnum, null=True, blank=True, default=MyEnum.BAR)

我需要迁移数据,所以我的迁移可能看起来像这样:

def migrate_not_for_sale_to_private(apps, schema_editor):
    FooModel = apps.get_model("foo", "FooModel")
    for obj in FooModel.objects.all():
        if obj.foo_field == "FOO":
            obj.foo_field = "BAR"
            obj.save()

此操作失败,因为我将foo_field的允许值更改为BARBAZ,因此,如果obj的值为FOO,则会爆炸并出现不允许的值错误。

如何正确执行?我可以保留MyEnum值不变,将其标记为旧值,但从长远来看,它会导致很多潜在的旧值字段。另一种方法是运行原始SQL命令(假设我正在使用PostgreSQL)。

python django django-models database-migration django-migrations
1个回答
0
投票
  1. default=MyEnum.FOO更改为default=MyEnum.BAR
  2. 阻止代码中的任何新FOO条目
  3. 从数据库将所有FOO对象迁移到BAR
  4. 删除FOO枚举

关于2.,您可以覆盖def save(self, *args, **kwargs):FooModel函数,以将任何新的FOO对象更改为BAR对象(或引发错误)

© www.soinside.com 2019 - 2024. All rights reserved.