Я хочу изменить формат данных в моей модели и заменить поле char на int. Старое поле называется objective
, а новое поле называется objective_new
Вот определение модели (отрывок):
from django.db import models
from django.utils.translation import gettext_lazy as _
class Timer(models.Model):
# ...
OBJECTIVE_HOSTILE = 1
OBJECTIVE_FRIENDLY = 2
OBJECTIVE_NEUTRAL = 3
OBJECTIVE_UNDEFINED = 4
OBJECTIVE_CHOICES = [
(OBJECTIVE_HOSTILE, _('Hostile')),
(OBJECTIVE_FRIENDLY, _('Friendly')),
(OBJECTIVE_NEUTRAL, _('Neutral')),
(OBJECTIVE_UNDEFINED, _('Undefined')),
]
objective_new = models.SmallIntegerField(
choices=OBJECTIVE_CHOICES,
default=OBJECTIVE_UNDEFINED,
verbose_name='objective',
)
objective = models.CharField(
max_length=254,
default="",
blank=True,
help_text='This field is no longer in use',
)
# ...
Чтобы преобразовать существующие данные в новый формат Я хочу использовать миграцию данных, которая отображает текст из старого поля в новое поле выбора.
И вот моя проблема: кажется, что класс модели, который я получаю при переносе данных, не содержит никаких констант, например, OBJECTIVE_CHOICES
, которые мне нужны для сопоставления.
Здесь мой код переноса данных (выдержка):
def migrate_forward(apps, schema_editor):
Timer = apps.get_model('timerboard', 'Timer')
objective_map = {x[1]: x[0] for x in Timer.OBJECTIVE_CHOICES}
# ...
Я получаю следующую ошибку:
AttributeError: type object 'Timer' has no attribute 'OBJECTIVE_CHOICES'
Конечно, я мог бы просто скопировать определение вариантов в мой скрипт переноса данных, но Я бы не хотел переопределять его в двух местах. Я что-то упускаю или классовые константы, такие как OBJECTIVE_CHOICES
, просто недоступны при переносе данных?
Это для Django 2.2.