如何使用域列表过滤 OpenERP 中的数据

Posted

技术标签:

【中文标题】如何使用域列表过滤 OpenERP 中的数据【英文标题】:How to filter datas in OpenERP using domain list 【发布时间】:2013-01-14 13:12:40 【问题描述】:

我想使用域过滤表达式过滤 OPenERP 中的记录

在记录中我有一个用户列表字段,所以我想获取用户登录列表的记录

[(user.id , 'in' , 'user_ids')]

这不起作用

它返回此错误:

File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 2356, in search
    return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count)
  File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 4846, in _search
    self._apply_ir_rules(cr, user, query, 'read', context=context)
  File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 4728, in _apply_ir_rules
    rule_where_clause, rule_where_clause_params, rule_tables = rule_obj.domain_get(cr, uid, self._name, mode, context=context)
  File "/usr/lib/pymodules/python2.7/openerp/addons/base/ir/ir_rule.py", line 156, in domain_get
    query = self.pool.get(model_name)._where_calc(cr, SUPERUSER_ID, dom, active_test=False)
  File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 4676, in _where_calc
    e = expression.expression(cr, user, domain, self, context)
  File "/usr/lib/pymodules/python2.7/openerp/osv/expression.py", line 632, in __init__
    self.parse(cr, uid, context=context)
  File "/usr/lib/pymodules/python2.7/openerp/osv/expression.py", line 759, in parse
    field_path = left.split('.', 1)
AttributeError: 'int' object has no attribute 'split'

请帮帮我。

【问题讨论】:

我们怎样才能做到这一点[***.com/questions/17722919/… 【参考方案1】:

您的域语法错误。

应该是[('user_ids', '=' , user.id)]

    搜索域中的每个元组需要有3个元素,格式为:('field_name', 'operator', value),其中:

    field_name 必须是对象模型字段的有效名称,可能遵循使用点符号的多对一关系,例如“street”或“partner_id.country”是有效值。

    operator 必须是具有此列表中有效比较运算符的字符串: =, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right 大多数这些运算符的语义是显而易见的。 child_of 运算符将查找给定记录的子或孙子记录, 根据该模型的语义(即遵循由 self._parent_name,默认parent_id

    value 必须是一个有效值,才能与 field_name 的值进行比较,具体取决于其类型。

可以使用 3 个逻辑运算符组合域条件,而不是在元组之间添加:'&'(逻辑与,默认),'|'(逻辑或) , '!'(逻辑非)。 这些是 prefix 运算符,'&' 和 '|' 运算符的数量为 2,而 ' !' 只是 1。第一次组合它们时要非常小心。

这里是从比利时和德国搜索名为ABC且语言不是英语的合作伙伴的示例::

[('name','=','ABC'),'!',('language.code','=','en_US'),'|',('country_id.code','=','be'),('country_id.code','=','de')]

'&' 被省略,因为它是默认值,当然我们可以使用 '!=' 作为语言,但这个域真正代表的是什么是::

(name is 'ABC' AND (language is NOT english) AND (country is Belgium OR Germany))

【讨论】:

优秀。文档中缺少如此详细的解释。 很好的答案!我能问一下在文档很差的情况下您如何在 Odoo 中解决问题吗?你有什么资源?谢谢 我曾经进入ORM文件,检查所有的类和方法以及代码。 嗨@SudhirArya,我需要一个基于两个条件的域:1. 产品应该存在于“product_ids”中 2. 或者它应该存在于“suggested_product_ids”中,带有 ('is_psa','! =',True),其中 *_ids 字段是 m2m,而 'is_psa' 是布尔字段。我在下面尝试了域,但没有运气。提前致谢。 domain="['|',('id','in',product_ids[0][2])('is_psa','!=',True),('id','in','suggested_product_ids[ 0][2]'))]" 你应该试试这个:domain="['|',('id', 'in', product_ids[0][2]), ('id', 'in', 'sugge‌ ​sted_product_ids[0][2]'), ('is_psa', '!=', True))]"【参考方案2】:

在一个简单的情况下这是对的,但是如果你想通过它的功能字段过滤当前对象,你会很惊讶这个字段的函数中的代码不会执行;取而代之的是 fnct_search 该字段的一部分将被执行,这将允许您做各种事情。

过滤器表达式的左侧当前对象的上下文中进行评估,右侧内部上下文(读取当前用户)。

左侧部分右侧之后进行评估,因此您可以向用户模型添加一个功能字段,在那里进行一些计算,然后在对象一侧接收这些计算并将它们考虑在内。

详情请看这个答案:https://***.com/a/21336100/674557

【讨论】:

以上是关于如何使用域列表过滤 OpenERP 中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用适用于 OpenOffice / LibreOffice 的 OpenERP 报表设计器插件获取字段列表

在 OpenERP 中,如何从父级(Many2One 对象)中显示或隐藏基于域的字段

如何使数组过滤器与异步函数端一起使用? [复制]

如何使指令使用过滤的 HTML 属性?

如何使分页与过滤 django 一起使用?

如何过滤列表框(VB)中的结果?