域表达式

来自Odoo大V社-odoo中文开发手册
7017511讨论 | 贡献2017年5月4日 (四) 05:58的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

域被用来筛选数据记录。它们使用特殊的语法,以便于Odoo ORM 将它们解析后生成对应的SQL WHERE数据库筛选语句。

域表达式是一个条件列表,每个条件是一个形如('field_name', 'operator', value')的元组。比如,以下这个就是只有一个条件的有效的域表达式:

[('is_done','=',False)].

以下就是每个元素的介绍:

filed_name 是需要筛选的字段,它可以使用点(.)来访问关系模块的字段。
value 是一个Python表达式的值。它可以使用字符值,比如:字符串,数字,布尔值,或则列表、某个字段、用户在context中自定义的有效的值。这里有两种在实际环境中,可能的出现在context中的可用于domains的值:
    当在客户端使用时,比如在窗口动作或字段的属性值中,传入当前视图中的有效的字段的值。但是不能使用点(.)拼接它们。
    当在服务器端使用时,比如在记录规则和服务器Python代码中,当前记录是一个对象,就可以使用点(.),访问它的字段。
operator 可以为:
    常用的操作符:<,>,<=,>=,=,!=。
    '=like'通配符,使用下划线(_)时,匹配一个任意字符,使用百分号(%)时,匹配多个字符。
    'like'匹配一个’%value%’的字符串。’ilike’与此类似但不区分大小写。‘not like’和‘not ilike’也可以使用
    'child of'在层级关系中,筛选子集
    'in'和’not in’筛选是否在一个列表里面,所以,给的值应该是个list。当在’to-many’的关系字段中,‘in’的作用和contains的作用一样

domain表达式是一个包含多项内容的list,因此,可以包含多个条件表达式元组。 默认情况下(隐含),这些条件之间是用AND逻辑符连接的,也就是说,它只返回满足所有条件的记录集。

显示的逻辑连接符也可以使用:and连接符(&,默认使用),或连接符(|)。这些连接符后面跟着两项内容,以递归的方式。我们一会儿会看见具体的实现。

感叹号(!),是非操作符(NOT),作用于紧挨它的后一个项。因此,它应该出现在否定项的前面。比如,['!', ('is_done','=',True)],这个表达式将筛选所有的没有完成的记录。

“下一项”也可以作为操作符作用于它的下一项,也就是嵌套定义。举一个例子,可能帮我们更好的理解这句话。 我们可以在服务器端的记录规则中找到如下类似的表达式:

['|', ('message_follower_ids', 'in', [user.partner_id.id]),
      '|', ('user_id', '=', user.id), ('user_id', '=', False)]

这个域筛选了,当前用户在记录的关注者列表中,或当前用户是负责人,或负责人字段为空值的所有记录。

第一个‘|’(OR)操作符筛选出的结果是,满足在关注者列表中的条件的所有记录,加上满足后面条件的所有记录。而后面一个条件又是另外两个条件联合查询:用户ID是当前用户或则为空值的记录。

下面这幅图能很好解释这种操作符的原理:

二叉树.jpg
上一节:上下文数据 下一节:窗体视图