1. 程式人生 > >odoo10學習筆記1(Domain表示式)

odoo10學習筆記1(Domain表示式)

今天學習下Domain表示式。

什麼是Domain

[('create_uid','=',user.id)]

Domain是個多條件的列表,每個條件是一個三元表示式:[(欄位名,操作符,值), (欄位名,操作符,值)]

Domain使用場合

  • 許可權管理中的行級許可權
  • tree檢視的過濾器
  • 其它學習到了再補充

欄位名

當前模型的欄位或者是通過點操作符訪問當前模型的Many2one / Many2Many物件。如果左邊是Many2Many物件的時候,則表示左邊只要任意一個值符合條件則符合條件。

操作符

名稱 說明
=,!=,>,>=,<,<= 比較運算,等於,不等於,大於,大於等於,小於,小於等於
like 模糊匹配,可以使用萬用字元,下劃線“_”匹配一個字元,百分號“%”匹配零或者多個字元
ilike 類似like,不區分大小寫
not like 模糊不匹配的
in 包含,判斷值是否在元素的列表裡面
not in 不包含,判斷值是否不在元素的列表裡面
child_of 判斷是否value的子記錄,通過_parent_name實現,不太理解
parent_left ???
parent_right ???

注意如果需要在xml使用Domain,大於,小於因為和標籤符號一樣所以需要轉義,大於>,小於<

值進行篩選的變數,必須能通過操作符來和欄位進行比較。

多條件的邏輯運算

['&', ('partner_id.coutnry_id.code
', '=', 'CN'), ('partner_id.coutry_id.code', '=', 'US')]

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))]

邏輯運算子包括

符號 說明
丨(or) 或,二元運算
&(and) 與,二元運算
!(no) 非,單目運算

邏輯運算子預設是'與',‘與’運算子可以不寫。

例項
“名字為 ABC”,就是一個最簡單的單條件Domain。

[('name','=','ABC')]

“名字為 ABC 而且 語言編碼不為en_US”,Domain裡條件預設邏輯關係就是and,所以如下。

[('name','=','ABC'),
 ('language.code','!=','en_US')]

“名字為 ABC 而且語言編碼不為 en_US 而且國家的編碼為 be 或者 de”。

[('name','=','ABC'),
 ('language.code','!=','en_US'),
 '|',('country_id.code','=','be'),
     ('country_id.code','=','de')]

如果我們要做到這個效果

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

當然了,我們為什麼不寫得讓自己也容易看一點呢,如下:

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


作者:luohuayong
連結:http://www.jianshu.com/p/ec55ddf3d857