2015-10-15 3 views
5

У меня есть модель с динамическим выбором, и я хотел бы вернуть пустой список выбора, если я могу гарантировать, что код выполняется в случае django-admin.py migrate/makemigrations, чтобы предотвратить создание или предупреждение о бесполезных изменениях выбора.Определить, выполняется ли код в контексте команды migrate/makemigrations

Код:

from artist.models import Performance 
from location.models import Location 

def lazy_discover_foreign_id_choices(): 
    choices = [] 

    performances = Performance.objects.all() 
    choices += {performance.id: str(performance) for performance in performances}.items() 

    locations = Location.objects.all() 
    choices += {location.id: str(location) for location in locations}.items() 

    return choices 
lazy_discover_foreign_id_choices = lazy(lazy_discover_foreign_id_choices, list) 


class DiscoverEntry(Model): 
    foreign_id = models.PositiveIntegerField('Foreign Reference', choices=lazy_discover_foreign_id_choices(),) 

Так что я думаю, если я могу обнаружить контекст выполнения в lazy_discover_foreign_id_choices то я могу выбрать для вывода пустой список выбора. Я думал о тестировании sys.argv и __main__.__name__, но я надеюсь, что возможно более надежный способ или API?

+1

Как именно ваш выбор динамичен? Не могли бы вы разместить какой-то код? – aumo

+0

Несомненно, код добавлен – DanH

+0

Как вы импортируете 'Performance' и' Location'? – Ivan

ответ

2

Решение, которое я могу придумать, заключается в подклассе команды Django makemigrations, чтобы установить флаг перед фактическим выполнением фактической операции.

Пример:

Поместите этот код в <someapp>/management/commands/makemigrations.py, он заменит значение по умолчанию makemigrations команды Django.

from django.core.management.commands import makemigrations 
from django.db import migrations 


class Command(makemigrations.Command): 
    def handle(self, *args, **kwargs): 
     # Set the flag. 
     migrations.MIGRATION_OPERATION_IN_PROGRESS = True 

     # Execute the normal behaviour. 
     super(Command, self).handle(*args, **kwargs) 

Сделайте то же самое для команды migrate.

И измените функцию динамического выбора:

from django.db import migrations 


def lazy_discover_foreign_id_choices(): 
    if getattr(migrations, 'MIGRATION_OPERATION_IN_PROGRESS', False): 
     return [] 
    # Leave the rest as is. 

Это очень Hacky, но довольно легко установить.

+0

Спасибо за предложение, но это не сработает. Кажется, что выбор полей модели выполняется до 'Command.handle()' – DanH

+0

Я пробовал его по моему проекту и, похоже, работал, я буду исследовать. – aumo

+0

@ DanH Я подтверждаю, что он отлично работает при чистой установке Django 1.8.5, вы уверены, что это новая команда, которая выполняется, а не по умолчанию? – aumo

4

Вот довольно не Hacky способ сделать это (так как Джанго уже создает флаги для нас):

import sys 
def lazy_discover_foreign_id_choices(): 
    if ('makemigrations' in sys.argv or 'migrate' in sys.argv): 
     return [] 
    # Leave the rest as is. 

Это должно работать во всех случаях.

+0

О, это действительно хороший способ сделать это. –

 Смежные вопросы

  • Нет связанных вопросов^_^