Я перехватываю исключение 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