以编程方式检查syncdb是否正在运行

时间:2011-10-15 10:03:31

标签: django

我有一些可以处理Django用户的信号处理程序。另外我正在使用南方。这些信号处理程序依赖于之前必须运行的一些迁移。

当Django执行snycdb并创建admin用户时,这些迁移没有运行,信号处理程序引发异常。

我正在寻找一种方法来检测Django当前是否运行syncdb,以便信号handerls可以跳过执行。

3 个答案:

答案 0 :(得分:2)

我捕获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

答案 1 :(得分:0)

我认为没有办法知道syncdb是否正在运行,但有一种方法可以处理python中的异常:

抓住并点击例外pass

try:
    # code that deals with django user
except ExceptionYouAreGetting:
    # seems like syncdb is running, let's pass for now
    pass

答案 2 :(得分:0)

AFAIK无法检测syncdb是否正在运行,但是,当syncdb或loaddata正在运行时,您的信号将收到一个额外的参数raw。

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

这样,您可以跳过执行syncdb时要运行的信号。