read_group方法中的域

时间:2019-05-07 14:08:26

标签: odoo openerp-7

有标准方法

 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

的记录

1 个答案:

答案 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 ...))