Odoo domain写法及运用
字段名Domain是一个元组,由3个元素组成 (字段名, 操作符, 值)如果是Many2one/Many2Many/One2many字段,可以通过'.'取出对应的属性,如:('routing_id.operation_ids.workcenter_id','=', active_id)操作符符号说明=,>.<,>=,<=,!=比较运算,等于,不等于,大于,大于等于,小于,小
字段名
Domain是一个元组,由3个元素组成 (字段名, 操作符, 值)
如果是Many2one/Many2Many/One2many字段,可以通过'.'取出对应的属性,如:
('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的子记录 |
示例:
('company_id','child_of',[user.company_id.id])
('company_level','not in',('common_company'))
有一个要注意的地方,'in'可以反向表示,比如:
('user_ids', 'in', user.id)
应用场景是当一个model中的字段是user_ids = field.Many2many('res.users'),我们可以将这个model的权限赋给这些用户,只有这些用户可以访问
<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)]
1、Domain条件表达式规则
最简单的格式:[('字段','操作符',值)]
例:
[('shenqr.user_id','=',uid)]
说明:domain中的单个条件是一个由三个元素组成的元组,所以务必加上
()
。元组中第一个参数是对象的字段名column
;元组中的第二个参数是比较运算符=,!=,>,>=,<,<=,like,ilike,in,not in,child_of,parent_left,parent_right
;元组中第三个就是用来比较的值了。多个条件用|
(or),&
(and),!
(no)逻辑运算符链接。逻辑运算符作为前缀放置于条件前面。|
与&
必须两个条件链接,!
对一个条件取反。默认逻辑运算符为&
。注意:在xml文件中使用时,
&
要用&
表示,>=
要用>&
表示,<=
要用<&
表示,!=
最好用><
表示。
2、不带逻辑运算符的简单表达式
过滤状态为待批:
[('state','=','wait_prove')]
过滤状态为草稿、待批:
[('state','in',('draft','wait_prove'))]
或者[('state','in',['draft','wait_prove'])]
过滤请假天数大于3天:
[('tians','>',3)]
3、带逻辑运算符的简单表达式
假设a,b分别是不带逻辑运算符的简单表达式:
a=('state','><','draft')
b=('tians','<=',1)
a and b:[a,b] 或 ['&',a,b]
a or b:['|',a,b]Eg:请假模块,副经理登录时待审批的请假单(状态是待批,并且请假天数在一天以内)菜单过滤条件:
[('state','=','wait_prove'),('tians','<=',1)]
4、带逻辑运算符的稍复杂的表达式
同上,假设a,b,c分别是不带逻辑运算符的简单表达式
a and b and c:[a,b,c] 或则 ['&','&',a,b,c]
a or b or c:['|','|',a,b,c]
a and b or c:['|','&',a,b,c]
a and (b or c):['&',a,'|',b,c]Eg:经理待审批的请假单(状态是待批,并且请假天数大于一天,并且是本部门的职员请假单,并且还不包含自己的请假单)菜单过滤条件
[('state','=','wait_prove'),('tians','>',1),('shenqr.user_id','<>',uid),('shenqr.department_id','=',department_id),('shenqr.user_id.groups_id','=',59)]
5、带逻辑运算符的更复杂的表达式
同上,假设a,b,c,e,f,g分别是不带逻辑运算符的简单表达式。
(a or b and c) or (d and e) : ['|','&','|',a,b,c,'&',d,e)]
Eg:总经理待审批的请假单(所有部门副经理或经理状态为待批的请假单,或3天以上部门经理批准过的请假单)菜单过滤条件:
['|','&','|',('shenqr.user_id.groups_id','=',60),('shenqr.user_id.groups_id','=',61),('state','=','wait_prove'),'&',('state','=','depmanager_proved'),('tians','>',3)]
(a or b and c) or (d and e) or (f and g)
['|','|','&','|',a,b,c,'&',d,e,'&',f,g]Eg:总经理全部的请假单(所有部门副经理或经理状态为待批的请假单,或3天以上部门经理批准过的请假单,或3天以上状态为同意或驳回的请假单据)菜单过滤条件:
['|','|','&','|',('shenqr.user_id.groups_id','=',60),('shenqr.user_id.groups_id','=',61),('state','=','wait_prove'),'&',('state','=','depmanager_proved'),('tians','>',3),'&',('state','in',['proved','rejected']),('tians','>',3)]
Domain的使用场景
1.关联字段
(Many2one/One2many/Many2many)过滤出不同的选择结果
default_debit_account_id = fields.Many2one('account.account', string='Default Debit Account', domain=[('deprecated', '=', False)])
如上:只有当account.account中字段deprecated=False的记录才能被选择显示
2.过滤出想要显示的记录
在ir.actions.act_windon中添加Domain,当某个地方调用这个动作时,只显示符合domain条件的记录
<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的使用场景还有许多,我就不一一列举了。
更多推荐
所有评论(0)