Обработка нулевых значений в поле выбора в Odoo
swe-notes.ruНедавно нактнулся на интересную особенность Odoo, которая касается поля типа Selection. Она заключается в том, что если в списке есть значение с ключом 0, то при выводе оно зануляется. Например, есть поле:
Так вот это поле при нахождении в таблице БД 0 в столбце status, в интерфейс выведет пустое значение, не строку "Начало".
Такое поведение было для меня слегка неожиданным, но я подумал что оно связано с особенностью python и я полез смотреть исходники класса fields.Selection.
Оказалось там есть 2 интересных функции:
- convert_to_read - отвечает за отображение значения поля при выполнении у модели метода read.
- convert_to_column - отвечает за преобразование значения в sql формат при вызове у модели метода write.
Надо отметить что такие функции есть и у других типов полей не только Selection.
Код convert_to_read:
В этой функции проблема в том, что при 0 значение value приходит None (так как значение 0 при чтении из БД интерпретируется в None из-за особенностей python), и поэтому возвращается False, а не значение 0.
Вторая проблема, по сути, аналогична и содержится в коде convert_to_column:
Как можно заметить тут проверяется значение на пустоту, и если его нет, то возвращается пустота и в БД идет значение NULL.
Если переопределить эти функции как показано ниже, то проблема c 0 будет решена: