第十一章 Domain
Domain的使用场景
Domian使用的场景非常多,比如:
- search方法中的domian过滤条件
- 视图中的过滤条件
- 视图属性中的过滤条件
- 过滤规则中的过滤条件
不同的场景下的过滤条件略有不同。
视图中的domain
uid: 当前用户的UID
视图中的domain只支持简单类型的值,比如,字符、整形、浮点型等。也就是说,不支持通过属性方式的引用:
<field name="out_location" position="before">
<field name="current_user" invisible="0"/>
</field>
<field name="out_location" position="attributes">
<attribute name="domain">[('usage','=','internal'),('id','=',current_user.id)]</attribute>
</field>
current_user字段是当前登录的用户,像上面这种方式,就会提示错误:
如果有计算的需求,这里的建议是新建一个compute的字段,将计算后的值赋给新字段。比如上面的例子可以写为:
<field name="out_location" position="before">
<field name="current_user_id" invisible="1"/>
</field>
<field name="out_location" position="attributes">
<attribute name="domain">[('usage','=','internal'),('id','=',current_user_id)]</attribute>
</field>
窗口动作中的domain
通常我们给菜单设置过滤,是通过给菜单绑定的动作设置domain来完成的,这里的domain写法跟其他的domain写法并无不同。只是在某些特定的情况下,我们需要使用一些特殊的技巧:
domain中需要使用ref的情况
如果我们像常规的方式:
<field name="domain">[('abc','=',ref('xxx.xxx'))]</field>
系统会提示ref不可用,这个时候我们就需要变通一下,使用eval函数将其转换为如下的形式:
<field name="domain" eval="[('abc','=',ref('xxx.xxx'))]"</field>
过滤规则中的domain
可以直接使用的变量:
user: 当前登录的用户
操作符
Odoo中受支持的操作符有:!(否定),|(或),&(且)。这三个用于domain的连接。另外还有诸如:'=', '!=', '<=', '<', '>', '>=', '=?', '=like', '=ilike', 'like', 'not like', 'ilike', 'not ilike', 'in', 'not in', 'child_of' 用于domain内部的条件判定。
- like: 大小写敏感的 %%。例如:[('input', 'like', 'open')],可以匹配 open, opensource, openerp, Odooopenerp
- not like: 大小写敏感的不匹配操作符。
- =like: 大小写敏感的全匹配 例如:[('input','=like','open')],只能匹配open
- ilike: 大小写不敏感的半匹配,例如 [('name', 'ilike', 'open')] 能匹配 Openerp, openerp, Opensource, opensource, Open, open, Odooopenerp, OdooOpenerp
- not ilike: 大小写不敏感的不匹配
- =ilike: 大小写不敏感的全匹配,[('name', '=ilike', 'open')]可以匹配 Open和open
- =?: 意思是如果某个过滤条件返回的结果是None或False则以True替代。例如: name = 'odoo' parent_id = False [('name', 'like', name), ('parent_id', '=?', parent_id)],将返回name的domain过滤结果&True。如果过滤条件是 name = 'odoo' parent_id = 'openerp' [('name', 'like', name), ('parent_id', '=?', parent_id)] 则将返回两个过滤条件的且的结果。