odoo16-domain
参考:https://blog.csdn.net/u013250491/article/details/86699928
domain的使用注意以下几点:
- 是在py文件中使用还是在xml中使用,py文件是在后端使用可以利用orm, 而xml是在前端渲染,使用的是js,没有办法使用orm
- 如果在xml中使用,domain的格式建议为[[]], 二维数组的形式,js 不太认识[()] 这个玩意
一 domain表达式规则
最简单的格式:[(‘字段名’,‘操作符’,值)]
例:[(‘shenqr.user_id’,’=’,uid)]
1 字段名
1.1 py文件
可以使用ORM, 比如create_uid.company_id.id
1.2 xml文件
因为xml文件是在前端浏览器解析的,所以不能使用orm,只能使用单纯的字段,当然有变通手段,如果需要关联字段,可以在模型中新增一个字段, 通过compute或者 related进行计算或者关联.
2 操作符
操作符 | 说明 |
---|---|
=,>,<,>=,<=,!= | 比较运算,等于,大于,小于,大于等于,小于等于,不等于 |
like | 模糊匹配,通过%value%进行匹配 |
ilike | 同like ,但是忽略大小写 |
=like | 可以使用模式匹配,下划线-匹配一个字符,百分号%匹配零或者多个字符 |
=ilike | 同ilike ,但是忽略大小写 |
not like | 通过%value%不匹配的 |
not ilike | 类似not like,但是忽略大小写 |
=? | 未设置或者等于,未设置表示当值是None或者是False,其余和=一样 |
in | 判断value是否在元素的列表里面 |
not in | 判断value是否不再元素的列表里面 |
child_of | 判断是否value的子录, [(A,‘child_of’,A)]返回true |
主要说明一下 child_of:
[('create_uid.company_id','child_of',[user.company_id.id])]
这句话表达的意思是, create_uid的公司是当前用户的公司或者子公司.
等价于
['|',('create_uid.company_id','=',[user.company_id.id]),('create_uid.company_id.parent_id','=',[user.company_id.id])]
3 值
-
字符串
-
布尔值 True False 数字等
-
在xml中, 可以使用uid ,不能获取到其他信息了,是否跟context有关系?
相关的js文件: addons/web/static/src/core/domain.js
4 条件间的逻辑
4.1 波兰表达式
domain使用了波兰表达式, 也称之为前缀表达式,可以不用括号就可以无歧义的表示运算顺序.
- 中缀表达式 : a + b (我们常见的)
- 前缀表达式 : + a b ( 波兰表达式,操作符在前面,方便计算机处理)
- 后缀表达式 : a b + ( 逆波兰表达式,方便计算机处理)
波兰表达式和逆波兰表达式第一个不需要括号,第二个用stack处理很方便,这两个东西其实就是一个东西,只不过用了不同的表达形式。
4.2 操作符
- “&” 默认操作符,可以省略,在xml中使用需要转义
- “|”
- “!”
简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。
以二元运算为例,从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。
案例:
<filter string="我的待办" name="myjob"
domain="['&','&',('user_id_deal', '=', uid),('state','=','0'),'|','&',('deal_type','=','1'),('chp_state','in',['0','1']),'&',('deal_type','=','2'),('chp_state','=','2')]"/>
二 domain使用场景
1 关联字段
(Many2one/One2many/Many2many)过滤出不同的选择结果
account_id = fields.Many2one('account.account', string='Default Debit Account', domain=[('active', '=', False)])
也可以用于关系字段,下拉框的级联显示
position_id = fields.Many2one('hx.base.position',"岗位名称",domain='[("department_id","=",department_id)]')
2 在动作中使用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>