Ok, je pense que j'ai compris cela. Le problème réside dans un problème de longue date avec Django et Psycopg2. Fondamentalement, Psycopg2 émettra automatiquement une instruction BEGIN à la base de données. Cependant, si Django pense qu'aucune modification de données n'a eu lieu, il n'émettra pas de COMMIT à la fin d'une transaction.
Il existe quelques solutions à ce problème, consultez http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application pour plus de détails. Idéalement, vous désactivez les validations automatiques (en définissant autocommit =True dans les paramètres de votre base de données, convention de dénomination peu pratique). Cela empêche les transactions sur les fonctions en lecture seule, mais également sur les fonctions d'écriture, vous devez donc envelopper manuellement ces fonctions dans un décorateur @commit_on_success.
Alternativement, ajoutez simplement django.middleware.transaction.TransactionMiddleware à vos classes Middleware. Cela encapsulera chaque demande dans une transaction. Cela signifie également encapsuler inutilement des requêtes en lecture seule dans une transaction, mais c'est une solution rapide et sale.