• odoo domain详解


    参考的以下文档:

    luohuayong:Odoo domain写法及运用

    baimo:odoo domain表达式

    1、domain 表达式规则

    最简单的格式:[('字段名','操作符',值)]

    例:[('shenqr.user_id','=',uid)]

    字段名

    如果是Many2one/Many2Many/One2many字段,可以通过'.'取出对应的属性,如:('create_uid.company_id.parent_id','=', user.company_id.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的子录,  [(A,'child_of',A)]返回true

    主要说明一下 child_of:

    [('create_uid.company_id','child_of',[user.company_id.id])]
    

    等价于

    ['|',('create_uid.company_id','=',[user.company_id.id]),('create_uid.company_id.parent_id','=',[user.company_id.id])]
    

    包括字符串,True或False,数字等

    在xml中,能取出当前登录用户user对象,你可以取出user.id,user.company_id.id等

    条件间的逻辑

    符号 说明
    & 与,表示符号后2个条件同时满足,默认关系,可以省略
    | 或,表示后面2条条件满足一个就行
    非,将后面一个条件反转,如果是ture,就变成False
    Odoo是使用了波兰表示法,简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。 #### 波兰表示法的运算顺序 ####

    以二元运算为例,从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。

    ['|','&','|',a,b,c,'&',d,e]
    其中a,b,c,e,f,g分别是不带逻辑运算符的表达式,表达式的运算顺序:

    ['|','&','|',a,b,c,'&',d,e]

    ['|','&',(a | b),c,'&',d,e]

    ['|',((a | b) & c),'&',d,e]

    ['|',((a | b) & c),(d & e)]

    [(((a | b) | c) | (d & e))]

    反之,如果我们要做到这个效果

    A and (B or C) and D and E
    

    先从里面开始,把or提前

    A and (or B C) and D and E
    

    把里面的and提前,去掉括号

    and A or B C and D E
    

    所以最后的domain可以这样写

    A, '|', B, C, D, E
    

    2、domain使用场景

    1. 关联字段

    (Many2one/One2many/Many2many)过滤出不同的选择结果

    account_id = fields.Many2one('account.account', string='Default Debit Account', domain=[('active', '=', 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>
    

    有什么不正确的,欢迎指正。

  • 相关阅读:
    TSQL Beginners Challenge 1
    SQL拾遗
    简易实体生成方式
    CTE-递归[2]
    编号处理
    行列转换/横转竖
    OUTPUT、Merge语句的使用
    关于SQL IO的一些资料
    对左值(lvalue)和右值(rvalue)的两种理解方式
    跨平台判断64位和32位开发的一些宏定义
  • 原文地址:https://www.cnblogs.com/wanxiangIT/p/10337129.html
Copyright © 2020-2023  润新知