Intento la excepción DatabaseError y compruebo si existe la entrada ContentType para el modelo que estoy tratando de usar, si no asumo que syncdb está sucediendo, de lo contrario retrotrae la transacción y vuelva a subir la excepción original. Este método incurre en un acceso de base de datos adicional solo cuando se genera 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
del Sur tiene su modelo y una mesa donde se registra la información, que las migraciones se ha runed y los que no lo era. ¿Tal vez podrías usar eso para verificar si las migraciones que necesitas han sido ejecutadas? – Ski
Esto también sería una opción. Pero dado que los manipuladores son para señales de posguarda en modelos relativamente guardados a menudo, me gustaría evitar un viaje de ida y vuelta adicional al DB en este momento. –
Creo que puede almacenar esa información de forma segura en una variable global y recuperarla solo una vez cuando se inicia la aplicación. – Ski