Odoo domain写法及运用

Domain的写法

Domain是一个元组,由3个元素组成 (字段名, 操做符, 值)dom

字段名

若是是Many2one/Many2Many/One2many字段,能够经过'.'取出对应的属性,如:ui

('routing_id.operation_ids.workcenter_id','=', active_id)

操做符

符号 说明
=,>.<,>=,<=,!= 比较运算,等于,不等于,大于,大于等于,小于,小于等于
like 模糊匹配,经过%value%匹配
=like 能够使用模式匹配,下划线-匹配一个字符,百分号%匹配零或者多个字符
ilike 相似like,可是忽略大小写
=ilike 相似=like,可是忽略大小写
not like 经过%value%不匹配的
not ilike 相似not like,可是忽略大小写
=? 未设置或者等于,未设置表示当值是None或者是False,其他和=同样
in 判断value是否在元素的列表里面
not in 判断value是否再也不元素的列表里面
child_of 判断是否value的子记录

示例:code

('company_id','child_of',[user.company_id.id])
('company_level','not in',('common_company'))

有一个要注意的地方,'in'能够反向表示,好比:orm

('user_ids', 'in', user.id)

应用场景是当一个model中的字段是user_ids = field.Many2many('res.users'),咱们能够将这个model的权限赋给这些用户,只有这些用户能够访问xml

<record id="mrp_dashboard_rule" model="ir.rule">
     <field name="name">mrp_dashboard_rule</field>
     <field name="model_id" ref="model_mrp_workcenter"/>
     <field name="global" eval="True"/>
     <field name="domain_force">[('user_ids', 'in', user.id)]</field>
</record>

包括字符串,True或False,数字等
在xml中,能取出当前登陆用户user对象,你能够取出user.id,user.company_id.id等对象

条件间的逻辑前缀

符号 说明
& 'AND'或者'与',表示后面2个条件同时知足。默认关系,能够省略
| 'OR'或者'或',表示后面2个条件知足一个就行
'NOT'或者'非',将后面一个条件反转,若是是True,就变成False

示例:字符串

[('name', '=', 'Allen'), '|', ('language.code', '!=', 'en_US'), ('company_id', '=', user.company_id.id)]

Domain的使用场景

1.关联字段

(Many2one/One2many/Many2many)过滤出不一样的选择结果get

default_debit_account_id = fields.Many2one('account.account', string='Default Debit Account', domain=[('deprecated', '=', False)])

如上:只有当account.account中字段deprecated=False的记录才能被选择显示string

2.过滤出想要显示的记录

在ir.actions.act_windon中添加Domain,当某个地方调用这个动做时,只显示符合domain条件的记录it

<record id="relate_partner_opportunities" model="ir.actions.act_window">
    <field name="name">Opportunities</field>
    <field name="res_model">crm.lead</field>
    <field name="view_mode">kanban,tree,form,graph,calendar</field>
    <field name="domain">[('type','=','opportunity')]</field>
    <field name="context">{
        'search_default_partner_id': active_id,
        'default_type': 'opportunity'
    }</field>
    <field name="view_id" eval="False"/>
    <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
</record>

3.权限过滤

<record id="account_move_comp_rule" model="ir.rule">
    <field name="name">Account Entry</field>
    <field name="model_id" ref="model_account_move"/>
    <field name="global" eval="True"/>
    <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
</record>

4.搜索过滤

<record id="view_crossovered_budget_search" model="ir.ui.view">
   <field name="name">crossovered.budget.search</field>
   <field name="model">crossovered.budget</field>
   <field name="arch" type="xml">
       <search string="Budget">
            <field name="name" filter_domain="[('name','ilike',self)]" string="Budget"/>
            <field name="date_from"/>
            <field name="date_to"/>
            <filter string="Draft" domain="[('state','=','draft')]" help="Draft Budgets"/>
            <filter string="To Approve" domain="[('state','=','confirm')]" help="To Approve Budgets" />
            <field name="state"/>
        </search>
    </field>
</record>

Domain的使用场景还有许多,我就不一一列举了。Domain的介绍就到此结束了,有什么问题,请你们多多指教。

相关文章
相关标签/搜索