Odoo 8:Many2many 域过滤器
Odoo 8: Many2many domain filter
我有几个具有多对多关系的组织类型,描述了哪些类型可能是其他类型的父级(例如,部门可以是子部门和工作组的父级)。这不是严格的层次结构(工作组可以是其他工作组的父级),因此存在多对多关系。
我的 organization_type 对象上有两个字段:allowed_parent_type_ids
和相反的 allowed_children_type_ids
.
现在我想根据其父级限制我的组织对象上的组织类型字段,因此 "department" 的子级只能 select 允许作为部门子级的组织类型和等等。
在我的表单视图中,我尝试了:
<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]
则没有错误,我在 selection...
中得到了三种组织类型
试试这个:
<field
name="organization_type_id"
domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids.ids)]"
/>
虽然 allowed_children_ids
是一组记录,但 allowed_children_ids.ids
是这些记录的 ID 列表。
你也可以从另一个方面来解决这个问题。这应该可以工作并且会更快:
<field
name="organization_type_id"
domain="[('allowed_parent_type_ids', '=', parent_id.organization_type_id)]"
/>
编辑:这个技巧在 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 的 Odoo 常见问题解答中找到一个很好的答案:https://www.odoo.com/fr_FR/forum/aide-1/question/complex-many2many-domains-in-views-41777#answer_41784
简而言之,您需要处理正确的值,因为 Many2many 值是一个元组列表,例如 [(6, 0, ids)]
。
因此您需要创建一个这样的域来比较 ID:
domain=[('id', 'in', allowed_type_ids[0][2])]
警告,如果您的 many2many 字段为空,这可能不适用于 Odoo 9.0。
我有几个具有多对多关系的组织类型,描述了哪些类型可能是其他类型的父级(例如,部门可以是子部门和工作组的父级)。这不是严格的层次结构(工作组可以是其他工作组的父级),因此存在多对多关系。
我的 organization_type 对象上有两个字段:allowed_parent_type_ids
和相反的 allowed_children_type_ids
.
现在我想根据其父级限制我的组织对象上的组织类型字段,因此 "department" 的子级只能 select 允许作为部门子级的组织类型和等等。
在我的表单视图中,我尝试了:
<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]
则没有错误,我在 selection...
试试这个:
<field
name="organization_type_id"
domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids.ids)]"
/>
虽然 allowed_children_ids
是一组记录,但 allowed_children_ids.ids
是这些记录的 ID 列表。
你也可以从另一个方面来解决这个问题。这应该可以工作并且会更快:
<field
name="organization_type_id"
domain="[('allowed_parent_type_ids', '=', parent_id.organization_type_id)]"
/>
编辑:这个技巧在 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 的 Odoo 常见问题解答中找到一个很好的答案:https://www.odoo.com/fr_FR/forum/aide-1/question/complex-many2many-domains-in-views-41777#answer_41784
简而言之,您需要处理正确的值,因为 Many2many 值是一个元组列表,例如 [(6, 0, ids)]
。
因此您需要创建一个这样的域来比较 ID:
domain=[('id', 'in', allowed_type_ids[0][2])]
警告,如果您的 many2many 字段为空,这可能不适用于 Odoo 9.0。