美文网首页
软件波兰表达式

软件波兰表达式

作者: 守望村夫 | 来源:发表于2020-02-14 14:58 被阅读0次

    什么是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')]

    波兰表示法,简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。

    波兰表示法的运算顺序

    以二元运算为例,从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。

    举个栗子

    ['|','&','|',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')]

    如果我们要做到这个效果

    Aand(B orC)andDandE

    先从里面开始,把or提前

    Aand(orB C)andDandE

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

    andAorB CandD E

    所以最后的domain可以这样写

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

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

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

    实例

    “名字为 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

    相关文章

      网友评论

          本文标题:软件波兰表达式

          本文链接:https://www.haomeiwen.com/subject/zxodfhtx.html