Константы модели недоступны при переносе данных? - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу изменить формат данных в моей модели и заменить поле 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.

...