Предположим, у нас есть Enum:
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
такими, какие они есть, пометив одно из них как устаревшее, но в конечном итоге это приведет к появлению множества потенциальных устаревших полей. Другой способ - запустить команду raw SQL (предположим, я использую PostgreSQL).