12

我想使用域过滤器表达式过滤 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'

请帮我。

4

2 回答 2

32

您的域语法错误。

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

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

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

  3. 运算符必须是具有此列表中有效比较运算符的字符串: =, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right 大多数运算符的语义是显而易见的。操作员将根据该模型的语义(即默认情况下child_of遵循由 命名的关系字段)查找是给定记录的子或孙子的记录 。self._parent_nameparent_id

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

域条件可以使用 3 个逻辑运算符组合,而不是可以在元组之间添加:' & '(逻辑与,默认),' | '(逻辑或),' '(逻辑非)。这些是前缀运算符以及 ' & ' 和 ' | ' 运算符是 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))
于 2013-01-31T04:39:01.827 回答
0

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

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

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

有关详细信息,请参阅此答案:https ://stackoverflow.com/a/21336100/674557

于 2015-03-21T02:46:43.817 回答