Odoo 8:Many2many域名过滤器

时间:2015-08-21 07:51:01

标签: openerp odoo-8

我有几种具有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],如果我用[0,1,2]替换域表达式中的allowed_type_ids,则没有错误,我在我的选择中得到了三种组织类型。 ..

2 个答案:

答案 0 :(得分:8)

试试这个:

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

答案 1 :(得分:5)

编辑:如果您的Odoo代码库是最新的,那么即使在我发布消息时,这个技巧在9.0和10.0中也不再起作用,请参阅https://github.com/odoo/odoo/issues/16072以获取更多详细信息。

有关替代方案,您可以尝试使用web_domain_field模块。 它目前在这里:https://github.com/OCA/web/pull/567

前回答:

要在Many2many上建立域名,您可以在Odoo常见问题解答中找到Olivier Dony的好答案: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。