Я получил УНИКАЛЬНОЕ ограничение, определенное в моей модели:Обработка исключений SQL ограничений в Odoo ОРМЕ
class FooBar(models.Model):
_name = 'my.foobar'
# ...
_sql_constraints = [
('foo_bar_uniq', 'unique("foo", "bar")', 'You could not step twice into the same foobar!')
]
и контроллере с кодом для создания новых объектов:
class FooBarController(http.Controller):
@http.route('/foobar/create/', auth='public', website=True)
def create(self, foo, bar):
http.request.env['my.foobar'].create({
'foo': foo,
'bar': bar,
})
return http.request.render('my.thank_you_page')
Если UNIQUE ограничения нарушается. Я получаю исключение IntegrityError
. Я хотел бы поймать его и показать пользователю другое сообщение:
from psycopg2 import IntegrityError
class FooBarController(http.Controller):
@http.route('/foobar/create/', auth='public', website=True)
def create(self, foo, bar):
try:
http.request.env['my.foobar'].create({
'foo': foo,
'bar': bar,
})
return http.request.render('my.thank_you_page')
except IntegrityError:
return http.request.render('my.error_page')
Это работает ... любопытно. IntegrityError
успешно поймана, но все последующие операции базы данных (которые, насколько я знаю, являются триггер автоматически website
модуля) конца в InternalError
:
InternalError: current transaction is aborted, commands ignored until end of transaction block.
Как следствие, все, что видит конечный пользователь страница Internal Server Error
.
Как я могу правильно обрабатывать УНИКАЛЬНЫЕ нарушения ограничений?
Это отличный ответ, спасибо! Мне понадобилось пару лет для меня слишком поздно, но я с удовольствием приму это. –