Existe una incoherencia entre el compromiso automático de Django y el modo de compromiso predeterminado de PostgreSQL.
Fuera de la caja, Django usa el modo PostgreSQL predeterminado "read committed" que combina todas las operaciones en una sola transacción que finaliza cuando el cursor db sale del alcance. El problema surge cuando ocurre un error durante esa serie de operaciones. Postgres espera que usted emita un rollback antes de continuar, y si no lo hace, psycopg2 lanza un InternalError la próxima vez que vaya a usar la conexión. Si confía en el autocompromiso de Django (el valor predeterminado), es probable que no retroceda correctamente.
Afortunadamente, psycopg2 tiene soporte para otro modo de operación llamado "autocommit" en el que no establece estas transacciones. Para aquellos que provienen de MySQL (o que intentan apoyar a ambos), esto trae cordura al mundo. En 1.1 agregaron soporte para exponerlo. Añadir lo siguiente a su configuración (necesita ser cambiado para 1.2 syntax si estás en el tronco)
DATABASE_OPTIONS = {
"autocommit": True,
}
La discusión para el boleto Django #3460 expone los detalles arenosos.
Gracias por preguntar esto: estaba considerando mudarme a PostgreSQL y me habría encontrado con alguno de estos también, pero no sé cuáles eran. –