Django: добавлен m2m через сквозные причины «текущая транзакция прервана, команды игнорируются до конца блока транзакции»

Я пытаюсь добавить отношение m2m через сквозную таблицу и ни с того ни с сего сталкиваюсь со следующей ошибкой:

«текущая транзакция прервана, команды игнорируются до конца блока транзакции»

Есть 2 странные проблемы по этому поводу. Во-первых, я успешно перенес/синхронизировал все свои соответствующие приложения. Во-вторых, как связанные модели, так и рассматриваемая модель (AddedFeature) успешно сохраняются в базе данных, даже если возникает ошибка. То есть, даже если транзакция прерывается, экземпляр AddedFeature сохраняется в БД.

http://dpaste.com/1357120/

Просто повторюсь: обновление моей БД и повторная миграция/повторная синхронизация не помогли решить проблему.


person tsurantino    schedule 26.08.2013    source источник
comment
Выключите debug_toolbar и посмотрите, изменится ли сообщение об исключении.   -  person Maciej Gol    schedule 26.08.2013
comment
Это сработало! Я понятия не имею, почему, хотя и как это исправить.   -  person tsurantino    schedule 26.08.2013
comment
Это связано с тем, что часть вашего кода, находящегося под управлением транзакциями, вызывает исключение, которое вы не обрабатываете (откатывая транзакцию до точки сохранения), а позже, когда промежуточное программное обеспечение обрабатывает ответ, оно переходит к промежуточному программному обеспечению django_toolbar, которое выполняет запросы sql во время транзакции, которая была прервано вашим кодом, что привело к возникновению исключения, с которым вы столкнулись. Это одно длинное предложение :O   -  person Maciej Gol    schedule 27.08.2013


Ответы (1)


Найдите проблему, возникшую до этой ошибки. Ваш код или код, который вы используете, игнорирует ошибку базы данных. Значит, следующая операция не удалась.

Вам нужно просмотреть базу данных и/или журналы приложений, чтобы найти предыдущую проблему. Затем определите, какая часть кода вашего приложения проглатывает исключение базы данных, не регистрируя его и не прерывая транзакцию.

Для этого может быть полезна установка log_statement = 'all' в postgresql.conf.

person Craig Ringer    schedule 27.08.2013