2015-08-19 2 views
2

Вот моя модель.Как получить доступ к переменной уровня класса модели при миграции данных?

Poll(models.Model): 
    title = models.CharField(max_length=1024) 
    MY_VAR = ['my_class_level_attribute'] # I want to access this 

Вот моя миграция данных:

def my_func(apps, schema_editor): 
    Poll = apps.get_model('my_app', 'Poll') 
    print Poll.MY_VAR 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('webmerge', '0012_previous_migration'), 
    ] 

    operations = [ 
     migrations.RunPython(my_func) 
    ] 

Линия print Poll.MY_VAR выдает ошибку атрибута. Я думаю, что этот вопрос может в том, как get_model выполняет в рамках миграции данных, поскольку следующие строки успеха в оболочке Django:

In [2]: from django.apps import apps 
In [3]: Poll = apps.get_model('my_app', 'Poll') 
In [4]: Poll.MY_VAR 
Out[4]: ['my_class_level_attribute'] 

ответ

1

Вы должны быть в состоянии импортировать модель

from my_app.models import Poll 

Если вы это сделаете , вы не должны удалять модель Poll или атрибут MY_VAR, в противном случае ваши миграции перестанут работать.

+0

Жаль, это похоже на единственно возможное решение. У кого-нибудь есть тот, который не требует жесткого кодирования этих вещей в миграции, делая их более хрупкими? –

+0

Ну, альтернативой является копирование данных непосредственно в миграцию, которая менее хрупкая, но менее СУХОЙ. Чтобы получить оба варианта, вам нужно изменить код, если я не ошибаюсь. Сделайте снимок вашей текущей модели, сохраните ее в каталоге моментальных снимков, содержимое которых неизменно или добавляется только и импортирует модель. Или вы можете интегрироваться с версией, записывать git shaw из текущей фиксации в процессе миграции и миграции, проверять соответствующий файл с этой фиксации ... тогда вы можете столкнуться с устаревшими зависимостями и т. Д. Это действительно непростая проблема. – DylanYoung