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。