假设我们有一个枚举:
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
的允许值更改为BAR
和BAZ
,因此,如果obj
的值为FOO
,则会爆炸并出现不允许的值错误。
如何正确执行?我可以保留MyEnum
值不变,将其标记为旧值,但从长远来看,它会导致很多潜在的旧值字段。另一种方法是运行原始SQL命令(假设我正在使用PostgreSQL)。
default=MyEnum.FOO
更改为default=MyEnum.BAR
FOO
条目FOO
对象迁移到BAR
FOO
枚举关于2.,您可以覆盖def save(self, *args, **kwargs):
的FooModel
函数,以将任何新的FOO
对象更改为BAR
对象(或引发错误)