我想使用域过滤器表达式
过滤OPENERP中的recods在recored我有一个用户列表的字段,所以我想得到用户登录列表的记录
[(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'
请帮帮我。
答案 0 :(得分:31)
您的域语法错误。
应为[('user_ids', '=' , user.id)]
搜索域中的每个元组都需要有3个元素,格式为:('field_name', 'operator', value)
,其中:
field_name 必须是对象模型字段的有效名称,可能遵循使用点表示法的多对一关系,例如'street'或'partner_id.country'是有效值。
运算符必须是此列表中包含有效比较运算符的字符串:
=, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right
大多数这些运算符的语义是显而易见的。
child_of
运算符将查找给定记录的子项或子项的记录,
根据该模型的语义(即遵循由...命名的关系字段)
self._parent_name
,默认为parent_id
。
值必须是有效值才能与 field_name 的值进行比较,具体取决于其类型。
域标准可以使用3个逻辑运算符组合,而不是在元组之间添加:'&amp; '(逻辑AND,默认),' | '(逻辑OR) ),'!'(逻辑NOT)。 这些是前缀运算符,'&amp; '和' | '运算符的arity是2,而'的arity >!'只是1.第一次将它们组合时要非常小心。
以下是从比利时和德国搜索名为 ABC 的合作伙伴的示例,其语言不是英语::
[('name','=','ABC'),'!',('language.code','=','en_US'),'|',('country_id.code','=','be'),('country_id.code','=','de')]
'&amp;'被省略,因为它是默认值,当然我们可以使用'!='作为语言,但这个域真的是什么表示是::
(name is 'ABC' AND (language is NOT english) AND (country is Belgium OR Germany))
答案 1 :(得分:0)
在一个简单的例子中,这是正确的,但是如果你想通过其功能字段过滤当前对象,你会非常惊讶这个字段的功能中的代码不会执行;相反,fnct_search将执行此字段的一部分,这将允许您执行各种操作。
过滤器表达式的左侧在当前对象和右侧部分的上下文中进行评估 - 在内部上下文的上下文中< / em>(读当前用户)。
左侧部分在之后进行评估,因此您可以向用户模型添加功能字段,在那里进行一些计算,然后在对象上接收这些计算&# 39; s并将其考虑在内。
有关详细信息,请参阅此答案:https://stackoverflow.com/a/21336100/674557