第十一章 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)] 则将返回两个过滤条件的且的结果。

results matching ""

    No results matching ""