我有一些可以处理Django用户的信号处理程序。另外我正在使用南方。这些信号处理程序依赖于之前必须运行的一些迁移。
当Django执行snycdb并创建admin用户时,这些迁移没有运行,信号处理程序引发异常。
我正在寻找一种方法来检测Django当前是否运行syncdb,以便信号handerls可以跳过执行。
答案 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时要运行的信号。