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>

有什么不正確的,歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM