odoo10學習筆記1(Domain表示式)
阿新 • • 發佈:2019-01-08
今天學習下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