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="['&','&',('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">Opportunitiesfield>
    <field name="res_model">crm.leadfield>
    <field name="view_mode">kanban,tree,form,graph,calendarfield>
    <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 Entryfield>
    <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.searchfield>
 <field name="model">crossovered.budgetfield>
  <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>

你可能感兴趣的:(Odoo16,odoo,python)