Программно проверить, работает ли syncdb - PullRequest
5 голосов
/ 15 октября 2011

У меня есть несколько обработчиков сигналов, которые работают на пользователя Django.Дополнительно я использую Юг.Эти обработчики сигналов зависят от некоторых миграций, которые должны выполняться раньше.

Когда Django выполнил snycdb и создал пользователя-администратора, эти миграции не запустились, и обработчики сигналов вызывают исключение.

Я ищу способ определить, выполняет ли Django в настоящее время syncdb,что сигнал хандерлс может пропустить исполнение.

Ответы [ 3 ]

2 голосов
/ 05 марта 2013

Я перехватываю исключение DatabaseError и проверяю, существует ли запись ContentType для модели, которую я пытаюсь использовать, если я не предполагаю, что происходит syncdb, в противном случае откат транзакции и повторное создание исходного исключения.Этот метод создает дополнительный доступ к БД только при возникновении ошибки DatabaseError.

    with transaction.commit_on_success():
        try:
            content_type = ContentType.objects.get_for_model(kwargs['instance'])
            for relation in WorkflowTypeRelation.objects.filter(content_type=content_type):
                workflow_instance = WorkflowInstance.objects.create(content_object=kwargs['instance'],
                    workflow_type=relation.workflow_type)
        except DatabaseError as database_error:
            try:
                ContentType.objects.get(model='workflowtyperelation')
            except ContentType.DoesNotExist:
                # Most probable running during syncdb phase,
                # so ignore the exception
                pass
            except DatabaseError:
                # ContentType model DB table doesn't exists,
                # raise original exception
                raise database_error
            else:
                # The ContentType model exists,
                # there is something wrong with the DB
                # raise original exception
                transaction.rollback()
                raise database_error
0 голосов
/ 11 декабря 2012

AFAIK Невозможно определить, запущен ли syncdb, однако, когда работает syncdb или loaddata, ваши сигналы получат дополнительный необработанный аргумент.

@receiver(post_save, sender=ModelA)
def signal_handler(sender, **kwargs):
    raw = kwargs.get('raw', False)
    if not raw:
        <do whatever>

Таким образом, вы можете пропустить сигналызапускаться при выполнении syncdb.

0 голосов
/ 15 октября 2011

Я не думаю, что есть способ узнать, работает ли syncdb, но есть способ обработать исключения в python:

Просто поймай и исключи и pass:

try:
    # code that deals with django user
except ExceptionYouAreGetting:
    # seems like syncdb is running, let's pass for now
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...