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

Django 以编程方式检查syncdb是否正在运行,django,Django,我有一些处理Django用户的信号处理程序。此外,我使用的是南方。这些信号处理程序依赖于某些迁移,这些迁移必须在迁移之前运行 当Django执行snycdb并创建管理用户时,这些迁移尚未运行,信号处理程序会引发异常 我正在寻找一种方法来检测Django当前是否运行syncdb,以便信号处理程序可以跳过执行 我认为没有办法知道syncdb是否正在运行,但有办法在python中处理异常: 只需捕获和异常并传递: try: # code that deals with django user

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

当Django执行snycdb并创建管理用户时,这些迁移尚未运行,信号处理程序会引发异常


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

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

只需捕获和异常并传递:

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

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

@receiver(post_save, sender=ModelA)
def signal_handler(sender, **kwargs):
    raw = kwargs.get('raw', False)
    if not raw:
        <do whatever>
@receiver(post_save,sender=ModelA)
def信号处理器(发送器,**kwargs):
raw=kwargs.get('raw',False)
如果不是生的:

通过这种方式,您可以跳过执行syncdb时要运行的信号。

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

虽然这是一个选项,但我不想吞下处理程序中的
DatabaseError
,因为这也可能表明存在其他严重问题。South有它的模型和一个表,它在其中记录哪些迁移已经运行,哪些没有运行。也许您可以用它来检查您需要的迁移是否已经运行?这也是一个选项。但是,由于处理程序用于相对经常保存的模型上的保存后信号,因此我希望在此时避免对db进行额外的往返。我认为您可以安全地将该信息存储在全局变量中,并在应用程序启动时仅检索一次。只有当从夹具加载数据时,原始参数才为真。但是,django在初始syncdb过程中创建的某些内容(如初始用户和默认站点)并不是从fixture中加载的,因此raw将像在任何其他保存场景中一样为False。