Почему связанные поля используют функцию записи - PullRequest
1 голос
/ 06 марта 2020
    _name = "my.table"

    building_id = fields.Many2one('building', related='floor_id.building_id', readonly=False)
    floor_id = fields.Many2one('building.floor')

Пользователь с доступом для чтения к таблицам building и building.floor пытается создать запись в my.table. Если пользователь выбирает building_id и floor_id вместе, возникает ошибка. Ошибка говорит о том, что у моего пользователя нет доступа к записи таблицы 'building.floor'. Мой вопрос: почему в связанном поле используется функция записи, в чем разница между вычислениями и связанными в этом сценарии?

1 Ответ

3 голосов
/ 06 марта 2020

Связанные поля - это очень простые вычисляемые поля. Настолько простыми они могут быть "реализованы" с одним параметром в определении поля. У Odoo есть обобщенные c методы для этих полей. Например, многие разработчики не пишут обратные методы для вычисляемых полей, которые обращают метод вычисления, потому что они просто не нужны. Но без него и без сохранения вычисленного поля Odoo устанавливает поле только для чтения.

Связанные поля имеют общий c обратный метод. В вашем случае, изменив building_id, когда уже был выбран floor_id, Odoo напишет building_id на этом floor_id.building_id, потому что именно так работают связанные поля (я знаю, что это не лучшее объяснение).

Пользователь явно не имеет прав на запись / обновление для модели builiding.floor, и поэтому в конце будет сообщение об ошибке доступа, потому что Odoo хочет написать новое здание на этаже.

Кажется, Я хочу, чтобы вы фильтровали полы по зданиям, но вам не следует использовать для этого соответствующее поле. Просто поместите домен на floor_id, который фильтрует по выбранному building_id:

floor_id = fields.Many2one('building.floor', domain="[('building_id', '=?', building_id)]")

Вы также можете использовать оператор домена =, но =? покажет все этажи, когда здание еще не было установлено .

...