Ok, penso di averlo capito. Il problema risiede in un problema di vecchia data con Django e Psycopg2. Fondamentalmente, Psycopg2 rilascerà automaticamente un'istruzione BEGIN al DB. Tuttavia, se Django ritiene che non sia avvenuta alcuna modifica dei dati, non emetterà un COMMIT alla fine di una transazione.
Ci sono alcune soluzioni a questo problema, guarda http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application per ulteriori dettagli. Idealmente si disattivano i commit automatici (impostando autocommit =True nelle impostazioni del database, convenzione di denominazione scomoda). Ciò impedisce le transazioni su funzioni di sola lettura, ma anche su funzioni di scrittura, quindi è necessario racchiudere manualmente tali funzioni in un decoratore @commit_on_success.
In alternativa, aggiungi semplicemente django.middleware.transaction.TransactionMiddleware alle tue classi Middleware. Questo avvolgerà ogni richiesta in una transazione. Ciò significa anche avvolgere inutilmente richieste di sola lettura in una transazione, ma è una soluzione rapida e sporca.