Odoo 8: Фильтр доменов Many2many
У меня есть несколько типов организации с отношением many2many, описывающим типы, которые могут быть родительскими для других типов (например, отдел может быть родительским подразделением и рабочей группой). Это НЕ строгая иерархия (рабочая группа может быть родительской для других рабочих групп), следовательно, отношение many2many.
У меня есть два поля для объекта organization_type: allowed_parent_type_ids
и обратный allowed_children_type_ids
.
Теперь я хочу ограничить поле типа организации на моем объекте организации в зависимости от его родительского элемента, поэтому дочерний элемент "отдела" может выбирать только типы организации, разрешенные для работы с дочерними подразделениями и т.д.
В моем представлении формы я попытался:
<field
name="organization_type_id"
domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids)]"
/>
Я также попытался связать связанное поле с разрешенными типами в объекте организации, но всегда получаю сообщение об ошибке.
Моя последняя попытка:
domain=[('id', 'in', allowed_type_ids)]
Это дает сообщение об ошибке:
TypeError: not all arguments converted during string formatting
Клиент на самом деле извлекает объект JSON, например "allowed_type_ids" = [0,1,2]
, и если я заменю allow_type_ids в выражении домена с помощью [0,1,2]
, ошибок нет, и я получаю три типа организации в моем выборе...
Ответы
Ответ 1
Попробуйте следующее:
<field
name="organization_type_id"
domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids.ids)]"
/>
Пока allowed_children_ids
- это набор записей, allowed_children_ids.ids
- это список идентификаторов этих записей.
Вы также можете приблизиться к этому с другой стороны. Это должно работать и быть быстрее:
<field
name="organization_type_id"
domain="[('allowed_parent_type_ids', '=', parent_id.organization_type_id)]"
/>
Ответ 2
EDIT: этот трюк больше не работает в 9.0 и 10.0 даже в то время, когда я отправил сообщение, если ваша кодовая база Odoo была обновлена. https://github.com/odoo/odoo/issues/16072 для более подробной информации.
Для альтернативы вы можете попробовать использовать модуль web_domain_field.
Он находится здесь: https://github.com/OCA/web/pull/567
Бывший ответ:
Чтобы иметь домен на Many2many, вы найдете хороший ответ от Olivier Dony по FAQ Odoo: https://www.odoo.com/fr_FR/forum/aide-1/question/complex-many2many-domains-in-views-41777#answer_41784
Короче говоря, вам нужно указать правильные значения, так как значение Many2many представляет собой список кортежей типа [(6, 0, ids)]
.
Таким образом, вам нужно создать такой домен, чтобы сравнить идентификаторы:
domain=[('id', 'in', allowed_type_ids[0][2])]
Предупреждение. Возможно, это не сработает на Odoo 9.0 в случае, если поле many2many пусто.