ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
前面几篇中都出现了Domain表达式,今天学习下Domain表达式。 #### 什么是Domain ~~~ [('create_uid','=',user.id)] ~~~ Domain是个多条件的列表,每个条件是一个三元表达式:[(字段名,操作符,值), (字段名,操作符,值)] #### Domain使用场合 * 权限管理中的行级权限 * tree视图的过滤器 * 其它学习到了再补充 #### 字段名 当前模型的字段或者是通过点操作符访问当前模型的Many2one / Many2Many对象。如果左边是Many2Many对象的时候,则表示左边只要任意一个值符合条件则符合条件。 #### 操作符 | 名称 | 说明 | | --- | --- | | =,!=,>,>=,<,<= | 比较运算,等于,不等于,大于,大于等于,小于,小于等于 | | like | 模糊匹配,可以使用通配符,下划线“_”匹配一个字符,百分号“%”匹配零或者多个字符 | | ilike | 类似like,不区分大小写 | | not like | 模糊不匹配的 | | in | 包含,判断值是否在元素的列表里面 | | not in | 不包含,判断值是否不在元素的列表里面 | | child_of | 判断是否value的子记录,通过_parent_name实现,不太理解 | | parent_left | ??? | | parent_right | ??? | 注意如果需要在xml使用Domain,大于,小于因为和标签符号一样所以需要转义,大于`>`,小于`<` #### 值 值进行筛选的变量,必须能通过操作符来和字段进行比较。 #### 多条件的逻辑运算 ~~~ ['&', ('partner_id.coutnry_id.code', '=', 'CN'), ('partner_id.coutry_id.code', '=', 'US')] ~~~ Odoo是使用了[波兰表示法](http://baike.baidu.com/link?url=lvYV-9HbGnLEnE90E57LoF84uFxFJZtCNbZiQjbATWs-qXGT_GdXz0TYlnNeMw98RML1ffUv1uHynb5D92vwSnJ2MWMvW9875TkFY1ccgH2TN5MMQj-UdTpGXRvgGWuNjtGrN-cnMT25GiuZ0-Gonq),简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。 波兰表示法的运算顺序 以二元运算为例,从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。 举个栗子 ~~~ ['|','&','|',a,b,c,'&',d,e] ~~~ 其中a,b,c,e,f,g分别是不带逻辑运算符的表达式,表达式的运算顺序: ~~~ ['|','&','|',a,b,c,'&',d,e] ['|','&',(a | b),c,'&',d,e] ['|',((a | b) & c),'&',d,e] ['|',((a | b) & c),(d & e)] [(((a | b) | c) | (d & e))] ~~~ 逻辑运算符包括 | 符号 | 说明 | | --- | --- | | 丨(or) | 或,二元运算 | | &(and) | 与,二元运算 | | !(no) | 非,单目运算 | 逻辑运算符默认是'与',‘与’运算符可以不写。 实例 “名字为 ABC”,就是一个最简单的单条件Domain。 ~~~ [('name','=','ABC')] ~~~ “名字为 ABC 而且 语言编码不为en_US”,Domain里条件默认逻辑关系就是and,所以如下。 ~~~ [('name','=','ABC'), ('language.code','!=','en_US')] ~~~ “名字为 ABC 而且语言编码不为 en_US 而且国家的编码为 be 或者 de”。 ~~~ [('name','=','ABC'), ('language.code','!=','en_US'), '|',('country_id.code','=','be'), ('country_id.code','=','de')] ~~~ 如果我们要做到这个效果 ~~~ 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 ~~~