有标准方法
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False)
我在上面调用一个super并传递一个像这样的域
[('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]), ('state', 'in', ['done'])]
它有效。
但是当我尝试追加
domain.append(('&'))
domain.append(('state', 'in', ['progress']))
我明白了
File "/home/www/workspace/openerp-7.0-20140804-231303/openerp/osv/expression.py", line 201, in normalize_domain
assert expected == 0, 'This domain is syntactically not correct: %s' % (domain)
AssertionError: This domain is syntactically not correct: [('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]), ('state', 'in', ['done']), '&', ('state', 'in', ['progress'])]
基本上,需要按日期和状态'done'
过滤所有记录,最重要的是要对状态'progress'的所有记录进行过滤。
更新。
如果我是用户域
domain = [('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]),
('state', 'in', ['done'])]
我得到3条记录,
如果我使用
domain = [('employee', 'in', [49]), ('state', 'in', ['progress'])]
我得到2条记录的结果,
但是,如果我像这样合并这些域,则会得到0条记录
domain = [('state', 'in', ['progress']),('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]),
('state', 'in', ['done'])]
我的域应如何显示5条记录?
可能的问题是'progress'
中没有end_date
答案 0 :(得分:1)
逻辑运算符“&”和“ |”具有Arity 2,这意味着必须跟随两个三元组(带有3个条目的“正常”域元组)。您只能追加一个三元组。在您的情况下,您只需删除'&'的append
,因为在不使用任何逻辑运算符的情况下,所有/每个三元组将默认情况下与AND组合。
逻辑运算符'!'友善1,顺便说一句。
您可以在the official documentation中找到足够的信息。
域是条件列表,每个条件都是三元组( (字段名,运算符,值)的列表或元组),其中:
field_name(str)当前模型的字段名称或关系 使用点表示法遍历Many2one “街道”或 'partner_id.country'运算符(str)用来比较 带有值的field_name。有效的运算符为:
=等于!=不等于
>大于
> =大于或等于
<小于
<=小于或等于
=? unset或等于(如果value为None或False,则返回true,否则表现为=)
= like将field_name与值模式匹配。模式中的下划线_表示(匹配)任何单个字符;百分号%与任何零个或多个字符的字符串匹配。
like将field_name与%value%模式匹配。与= like相似,但在匹配之前用'%'包裹值
不喜欢与%value%模式不匹配
不区分大小写,例如
不喜欢,不区分大小写,不喜欢
= ilike不区分大小写= like
in等于value中的任何项目,value应该是项目列表
不存在不等于价值中的所有项目
child_of是值记录的子代(后代)。考虑到模型的语义(即,以_parent_name命名的关系字段之后)。
可以使用前缀形式的逻辑运算符组合域条件:
'&'逻辑与,默认操作,用于合并后跟一个条件的条件 另一个。 Arity 2(使用接下来的2个条件或组合)。
'|'逻辑或,对等2。
'!'逻辑非,arity 1。
编辑:即使应该是另一个问题,我也会尝试解决您的特殊域名问题:
[('employee_id', 'in', [49]),
'|',
('state', 'in', ['progress']),
'&', ('state', 'in', ['done']),
'&', ('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30')]
结果应为(伪):
EMPLOYEE with ID 49 AND
(STATE is progress OR (STATE is done AND END_DATE is between ...))