odoo16-domain

odoo16-domain

在这里插入图片描述

参考:https://blog.csdn.net/u013250491/article/details/86699928

domain的使用注意以下几点:

  1. 是在py文件中使用还是在xml中使用,py文件是在后端使用可以利用orm, 而xml是在前端渲染,使用的是js,没有办法使用orm
  2. 如果在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="['&amp;','&amp;',('user_id_deal', '=', uid),('state','=','0'),'|','&amp;',('deal_type','=','1'),('chp_state','in',['0','1']),'&amp;',('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>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值