什么是Domain

  1. [('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,大于,小于因为和标签符号一样所以需要转义,大于>,小于<

值进行筛选的变量,必须能通过操作符来和字段进行比较。

多条件的逻辑运算

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

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

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

举个栗子

  1. ['|','&','|',a,b,c,'&',d,e]

其中a,b,c,e,f,g分别是不带逻辑运算符的表达式,表达式的运算顺序:

  1. ['|','&','|',a,b,c,'&',d,e]
  2. ['|','&',(a | b),c,'&',d,e]
  3. ['|',((a | b) & c),'&',d,e]
  4. ['|',((a | b) & c),(d & e)]
  5. [(((a | b) | c) | (d & e))]

逻辑运算符包括

符号 说明
丨(or) 或,二元运算
&(and) 与,二元运算
!(no) 非,单目运算

逻辑运算符默认是'与',‘与’运算符可以不写。

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

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

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

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

“名字为 ABC 而且语言编码不为 en_US 而且国家的编码为 be 或者 de”。

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

如果我们要做到这个效果

  1. A and (B or C) and D and E

先从里面开始,把or提前

  1. A and (or B C) and D and E

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

  1. and A or B C and D E

所以最后的domain可以这样写

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

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

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

 

作者:luohuayong
链接:https://www.jianshu.com/p/ec55ddf3d857
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Domain 表达式的用法的更多相关文章

  1. (23)odoo中的domain表达式

    ---------更新日期:09:10 2016-03-03 星期四---------* Domain 表达式             # 用于过滤记录数,相当于sql的where       ('f ...

  2. SQL进阶1:case表达式的用法示例

    一:case表达式的用法 1.SQL中的case表达式的作用是用来对"某个变量"进行某种转化,通常在select字句中使用,举个例子: 不能看出,case表达式很像我们的if el ...

  3. python lambda表达式简单用法【转】

    python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>& ...

  4. cron表达式的用法 【比较全面靠谱】

    转: cron表达式的用法 cron表达式通过特定的规则指定时间,用于定时任务,本文简单记录它的部分语法和实例,并不完全,能覆盖日常大部分需求. 1. 整体结构 cron表达式是一个字符串,分为6或7 ...

  5. struts2中#,$,%的用法以及el,ognl表达式的用法

    OGNL, JSTL, STRUTS2标签中符号#,$,%的用法示例 取Session中的值 <c:out value="${sessionScope.user.userId}&quo ...

  6. C++11 中function和bind以及lambda 表达式的用法

    关于std::function 的用法:  其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...

  7. FEL表达式的用法

    Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运算符(+.-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单. Fel有双引擎,同时支持解释执 ...

  8. (备忘)cron表达式的用法

    一.结构 cron表达式用于配置cronTrigger的实例,实现任务调度的功能. Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格 ...

  9. SQL 选择列 IF表达式,Contains表达式的用法

    因为业务需要需要使用到, 列中的字段或根据列值是否满足某一条件,进行输出.比如类似与  select if()  ……from……:(但是SQL Server 没有 if 表达式) 比如,如果Scor ...

随机推荐

  1. back propogation 的线代描述

    参考资料: 算法部分: standfor, ufldl  : http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial 一文弄懂BP:https: ...

  2. tomcat启动报错:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException:

    tomcat日志: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start com ...

  3. java 集合综述(总结于多位博友)

    http://www.cnblogs.com/shunran/p/3459065.html(good) java集合类主要负责保存.盛装其他数据,因此集合类也称容器类. java集合类分为:set.l ...

  4. Hadoop Shell

    1.常用的一些Shell 再好的博客,都不如官方文档好用: http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html

  5. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(8):装配SpringBean概述(如何合理使用装配级别)

    一. 装配Bean概述  关于如何将自己开发的Bean配置到Spring IoC容器中,大部分场景下,我们都会使用ApplicationContext的具体实现类,因为对应的Spring IoC容器功 ...

  6. 9.29学习的js基础

    js基础 1.三种js引入方式    a).<input type="button" value="点击事件" onClick="documen ...

  7. Xshell 连接Linux虚拟机失败解决办法

    当我们在VMWare上安装好Ubuntu虚拟机后,有时候会需要使用多个terminal窗口,但是在虚拟机中多个窗口互相切换查看不方便,这时候用物理机的xshell工具连接到虚拟机中去就显得很方便.直接 ...

  8. ARM汇编中一些重要伪指令

    IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的 EXPORT ,表示本程序里面用到的变量提供给其他模块调用的. 以上两个在汇编和C语言混合编程的时候用到 ENDP    表示PRO ...

  9. Kernel-----EXPORT_SYMBOL使用

    EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动 导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的. 2.6就必须用EX ...

  10. [Postgres]Postgres单用户模式执行VACUUM

    # su - postgres $ /usr/local/pgsql/bin/postgres --single -D /usr/local/pgsql/data [不能VACUUM的数据库] Pos ...