Dobře, myslím, že jsem na to přišel. Problém spočívá v dlouhodobém problému s Django a Psycopg2. Psycopg2 v zásadě automaticky vydá příkaz BEGIN do DB. Pokud se však Django domnívá, že nedošlo k žádné změně dat, nevydá na konci transakce COMMIT.
Existuje několik řešení tohoto problému, podívejte se na http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application Více podrobností. V ideálním případě vypnete automatické odevzdání (nastavením autocommit =True v nastavení DB, nepohodlná konvence pojmenování). To zabraňuje transakcím ve funkcích pouze pro čtení, ale také ve funkcích pro zápis, takže musíte tyto funkce ručně zabalit do dekorátoru @commit_on_success.
Případně stačí přidat django.middleware.transaction.TransactionMiddleware do svých tříd Middleware. Tím se každý požadavek zabalí do transakce. Znamená to také zbytečně zabalovat do transakce požadavky pouze pro čtení, ale je to rychlé a špinavé řešení.