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是使用了波兰表示法,简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。
波兰表示法的运算顺序
以二元运算为例,从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。
举个栗子
['|','&','|',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
作者:luohuayong
链接:https://www.jianshu.com/p/ec55ddf3d857
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Domain 表达式的用法的更多相关文章
- (23)odoo中的domain表达式
---------更新日期:09:10 2016-03-03 星期四---------* Domain 表达式 # 用于过滤记录数,相当于sql的where ('f ...
- SQL进阶1:case表达式的用法示例
一:case表达式的用法 1.SQL中的case表达式的作用是用来对"某个变量"进行某种转化,通常在select字句中使用,举个例子: 不能看出,case表达式很像我们的if el ...
- python lambda表达式简单用法【转】
python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>& ...
- cron表达式的用法 【比较全面靠谱】
转: cron表达式的用法 cron表达式通过特定的规则指定时间,用于定时任务,本文简单记录它的部分语法和实例,并不完全,能覆盖日常大部分需求. 1. 整体结构 cron表达式是一个字符串,分为6或7 ...
- struts2中#,$,%的用法以及el,ognl表达式的用法
OGNL, JSTL, STRUTS2标签中符号#,$,%的用法示例 取Session中的值 <c:out value="${sessionScope.user.userId}&quo ...
- C++11 中function和bind以及lambda 表达式的用法
关于std::function 的用法: 其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...
- FEL表达式的用法
Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运算符(+.-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单. Fel有双引擎,同时支持解释执 ...
- (备忘)cron表达式的用法
一.结构 cron表达式用于配置cronTrigger的实例,实现任务调度的功能. Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格 ...
- SQL 选择列 IF表达式,Contains表达式的用法
因为业务需要需要使用到, 列中的字段或根据列值是否满足某一条件,进行输出.比如类似与 select if() ……from……:(但是SQL Server 没有 if 表达式) 比如,如果Scor ...
随机推荐
- 《Maven实战》
原创作者: 许晓斌 阅读:61148次 评论:19条 更新时间:2011-06-23 你是否早已厌倦了日复一日的手工构建工作?你是否对各个项目风格迥异的构建系统感到恐惧?Maven ...
- mongo学习-稀疏索引
因为,如果要创建唯一索引,那么如果这个值有好几个为Null的,所以也会导致我们创建索引失败,那么我们可以引进系数索引这个概念,它可以做到,支持如果值存在的情况,它必须是唯一的,我们可以 将 uniqu ...
- 数据库SQL优化大总结之 百万级数据库优化方案(转)
出处:http://www.cnblogs.com/yunfeifei/p/3850440.htm 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不 ...
- 在 CentOS 上部署 Nginx 环境
这里的案例主要通过虚拟机( vmware workstation (14) )的方式安装 Center OS 到本地环境 资源下载: vmware workstation / CentOS 本次 ...
- sql server锁检测
有时候系统运行老感觉效率不高,并且有时候sql还有超时的报错,但是并发量并不高.通过排查定位sql是否有执行效率问题 -- 开事务, 以保持锁 BEGIN TRAN -- 更新 update tabl ...
- toolbox类
新建Qt 应用,项目名称为“c”,基类选择“QWidget”,取消“创建界面”复选框的选中状态. 添加该工程的提供主要显示界面的函数所在的文件,在“c”项目名上单击鼠标右键,在弹出的快捷菜单中选择“ ...
- .NET基础 (03)生成、部署和管理
生成.部署和管理1 如何生成强签名的程序集2 如何把程序集放入GAC中3 延迟签名及其作用4 程序集的版本分哪几部分 1 如何生成强签名的程序集在生成程序集时,CLR提供了两种可选类型:强签名程序集. ...
- 阿里云ECS云服务器编译安装PHP遇到virtual memory exhausted: Cannot allocate memory
阿里云编译安装php时遇到virtual memory exhausted: Cannot allocate memory 买了个服务器, 1G 的内存阿里云服务器,编译东西按说应该够了,安装相关的内 ...
- [LeetCode 题解]: Count and Say
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- [转载].NET开发常用的10条实用代码
1.读取操作系统和CLR的版本 OperatingSystem os = System.Environment.OSVersion; Console.WriteLine(“Platform: {0}” ...