2015-08-21 7 views
12

У меня есть несколько типов организации с отношением many2many, описывающим типы, которые могут быть родительскими для других типов (например, отдел может быть родителем для суб-отдела и рабочей группы). Это НЕ строгая иерархия (рабочая группа может быть родительской для других рабочих групп), следовательно, отношение many2many.Odoo 8: Many2many фильтр домена

У меня есть два поля на моем объекте организации_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] и если я заменю allowed_type_ids в выражении домена с [0,1,2] ошибок нет, и я получаю три типа организации в моем выборе ...

+1

Попробуйте использовать domain = "[('id', 'in', allowed_children_ids [0] [2])]" –

ответ

7

Попробуйте следующее:

<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)]" 
    /> 
+1

Я не мог получить первое решение для работы (я пробовал что-то подобное), но второй подход работал. Я использовал «in» в качестве оператора. Кажется, что логика не имеет «идентификаторов в id», но она работает ... – cgs

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 вы найдете хороший ответ от Оливье Доний на Odoo FAQ: 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 поле пусто.

+1

Я верю, что вы разрешили__имя_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и_и__и__и__и__и__и__и_по_иде [0] - Возможно, это должно быть «allowed_type_ids и allowed_type_ids [0] [2]», чтобы убедиться, что список действителен. Во всяком случае, аккуратный маленький трюк. ;-) – cgs

+0

@cgs Действительно вы правы, я исправил его – Yannick

+0

Знаете ли вы, что это недавно изменилось? Клянусь, это работало для меня до последних двух дней. Теперь, когда я просматриваю вывод с сервера в моем представлении, мое пользовательское поле many2many не показывает 'x_my_field: [[6, 0, [id1, id2]]', как это было раньше. Теперь он либо показывает просто массив идентификаторов, либо иногда он отображает массив из других многомашиновых команд, таких как [[5], [1, id1, {}], [1, id2, {}]] '. Что-то изменилось? Я использую Odoo 10 Saas. – flyingL123

Смежные вопросы