Je piège l'exception DatabaseError et vérifie si l'entrée ContentType pour le modèle que j'essaie d'utiliser existe, sinon je suppose que syncdb est en cours, sinon annule la transaction et relance l'exception d'origine. Cette méthode n'entraîne un accès DB supplémentaire que lorsque DatabaseError est déclenché.
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
South a son modèle et une table où il enregistre les informations sur lesquelles les migrations ont été exécutées et celles qui ne l'ont pas été. Peut-être pourriez-vous l'utiliser pour vérifier si les migrations dont vous avez besoin ont été exécutées? – Ski
Ce serait également une option. Mais puisque les gestionnaires sont pour les signaux post-sauvegarde sur des modèles relativement souvent sauvés, je voudrais éviter un tour supplémentaire à la DB à ce stade. –
Je pense que vous pouvez stocker ces informations en toute sécurité dans la variable globale et ne les récupérer qu'une seule fois lorsque l'application est démarrée. – Ski