Odoo Domain(过滤规则)使用教程

ERP系统里角色众多,权限交错,常见的需求会有不同角色的用户登陆进来看到不一样的数据或者不同的菜单看到不同的记录。需要不同角色的用户登陆进来看到不一样的的数据。在Odoo里面实现各种的“过滤”都是通过Domain来实现的。Domain中文叫做“域”,它起到的作用是“过滤规则”。Odoo里面很多功能都需要用到Domain,操作层面的记录规则、过滤器、动作;代码层面的search方法等都需要用到Domain。

为什么要用Domain?

ERP系统里角色众多,权限交错,常见的需求会有不同角色的用户登陆进来看到不一样的数据或者不同的菜单看到不同的记录。需要不同角色的用户登陆进来看到不一样的的数据。在Odoo里面实现各种的“过滤”都是通过Domain来实现的。Domain中文叫做“域”,它起到的作用是“过滤规则”。Odoo里面很多功能都需要用到Domain,操作层面的记录规则、过滤器、动作;代码层面的search方法等都需要用到Domain。

什么是Domain?

Domain是个多条件的列表,每个条件是一个三元表达式:[(字段名,操作符,值), (字段名,操作符,值)]。

字段名

当前模型的字段或者是通过_点操作符_访问当前模型的Many2one/Many2many对象,如果左边是Many2many对象的时候,则表示左边只要任意一个值符合条件则符合条件。例如是:你的Domain是用在sale.order上的,然后你想根据客户的国家编码来进行筛选可以这样写partner_id.country_id.code。

操作符

=,!=,>,>=,<,<=, 

这些就是我们平常用的“等于”,“不等于”,“大于”,“大于等于”,“小于”,“小于等于“。

=?

未设置或者等于,未设置就是当值是None或者是False,其余和“=”一样。

=like

可以使用模式匹配:下划线“_”匹配一个字符,百分号“%”匹配零或者多个字符。 这里默认的匹配模式是:value(不加其他通配符)。

like

通过%value%匹配。 常用于模糊搜索(例如:搜索名字包含“123”的记录)

not like

通过%value%不匹配的。

ilike

类似like,忽略大小写。

=ilike

类似=like,忽略大小写。

not ilike

类似not like,忽略大小写。

in

判断value是否在元素的列表里面。

not in

判断value是否不再元素的列表里面。

child_of

判断是否value的子记录,通过_parent_name实现。

进行筛选的变量,必须能通过操作符来和字段进行比较。结合上面的例子,如果我们想过滤中国客户的订单可以这样[(‘partner_id.country_id.code’, ‘=’, ‘CN’)]。

条件间的逻辑

看完每个条件里面的写法,那么现在来看看各个条件之间的组合关系。Odoo是使用了波兰表示法__,简单来说就是一种无需括号的表达方法,可以看看小节图里就是波兰表示法表示3+4。

条件间使用的逻辑前缀:

& :逻辑 AND,条件间的默认关系。2个参数(后2个条件或者条件组合) ,例如:

['&', ('partner_id.coutnry_id.code', '=', 'CN'), ('partner_id.coutry_id.code', '=', 'US')]

这里的 & 就是把后面的2个条件通过AND组合起来也就是 A AND B,但是注意到这里说的是还有“条件组合”的情况,所以还有可能是

['&', ('partner_id.coutnry_id.code', '=', 'CN'), 
'&',('partner_id.coutry_id.code', '=', 'US'), ('partner_id.coutry_id.code', '=', 'GB')]

转换为一般的表示方法则是 A AND (B AND C),但是因为’&’是默认的逻辑关系,所以我们其实可以不用显式表示

[('partner_id.coutnry_id.code', '=', 'CN'),('partner_id.coutry_id.code', '=', 'US'), 
('partner_id.coutry_id.code', '=', 'GB')]

|:逻辑 OR,2个参数。
!:逻辑 NOT,1个参数。

实例

“名字为 ABC”,就是一个最简单的单条件Domain。

[('name','=','ABC')]

“名字为 ABC 而且 语言编码不为 en_US”,Domain里条件默认逻辑关系就是and,所以如下。

[('name','=','ABC'),
 ('language.code','!=','en_US')]

“名字为 ABC 而且语言编码不为 en_US 而且国家的编码为 be 或者 de”。or的逻辑关系是用”|”表示。

[('name','=','ABC'),
 ('language.code','!=','en_US'),
 '|',('country_id.code','=','be'),
     ('country_id.code','=','de')]

当然还有简单一点的写法

[('name','=','ABC'),
 ('language.code','!=','en_US'),
 ('country_id.code','in', ['be', 'de'])]

条件里面丰富的操作符可以方便地让我们转换条件,例如 = -> !=, < -> >=。注意如果需要在xml使用Domain,大于,小于因为和标签符号一样所以需要转义大于=>&gt;,小于=>&lt;

如果我们要做到这个效果

A and (B or C) and D and E

先从里面开始,把or提前

A and (or B C) and D and E

把里面的and提前,去掉括号

and A or B C and D E

所以最后的Domain可以这样写

A, '|', B, C, D, E

当然了,我们为什么不写得让自己也容易看一点呢,如下:

A, D, E, '|', B, C

通过Domain我们可以管理我们的权限,定制我们需要的过滤器,让Odoo成为更贴合我们需要的ERP系统。