ODOO 域(條件)表達式的書寫方法

摘抄自源碼 /doc/howtos/backend.rst  第 710 行

域是用於選擇模型記錄子集的條件列表。 每個條件都是一個三元組,其中包含一個字段名稱,一個運算符和一個值。例如,在產品模型上過濾出 類型爲 service 且 單價超過 1000 的 產品,domain書寫如下:

 [('product_type', '=', 'service'), ('unit_price', '>', 1000)]

默認情況下,邏輯與關係使用一個隱式的``&``(AND)組合在一起,就像上面的例子,簡單的條件與關係,可忽略``&``(AND)不寫。 

邏輯運算符``&''(AND),``|''(OR)和``!''(NOT)可用於顯式組合條件。 它們在前綴位置使用(運算符插入在其參數之而不是參數之間)。 例如,在產品模型上過濾出 類型爲 service 或 單價不在1000到2000之間的 產品,domain書寫如下: 

 [
    '|',
    ('product_type', '=', 'service'), 
    '!', '&',
    ('unit_price', '>=', 1000),
    ('unit_price', '<', 2000)
]

 在上面的例子中,用到了 邏輯與``&``(AND), 邏輯或``|``(OR), 邏輯非``!``(NOT)。事實上,這個domain其實也可以不用 邏輯非``!``(NOT)。但爲了說明 邏輯非``!``(NOT)的用法,這個domain使用了其他的書寫方式(爲了完成一個過濾條件,可能會有多種domain可以實現)。接下來分析一下,怎麼去寫一個複雜的domain。


在我個人看來,書寫一個正確的domain,最重要的是格式。我所說的格式,指的是文本的格式,類似於排版的概念。而不是書寫規則。因爲格式清晰了,條件寫起來不會讓自己覺得亂,摸不着頭腦,或者懷疑自己是不是寫亂了。那麼,就拿上面的例子,做一個書寫過程分析。

需求說:在產品模型上過濾出 類型爲 service 或 單價不在1000到2000之間的 產品。總體一看,是個或關係,兩個條件。使用一個 ``|`` 就可以了,帶着格式,這麼寫:

[
    "|",
    條件1,
    條件2
]

 接下來,分析條件1怎麼寫, 類型爲 service ,很簡單,就是一個簡單的三元組,給上面加進去:

[
    "|",
    ('product_type', '=', 'service'), 
    條件2
]

繼續分析條件2,單價不在1000到2000之間,這個條件理解一下:不在1000到2000之間,那先書寫一個在1000到2000之間的,再來一個 邏輯非``!``(NOT) 不就可以啦?

1 先加上單價在1000到2000之間的,是不是就是個  邏輯與``&``(AND)

[
    "|",
    ('product_type', '=', 'service'), 
    '&',
    ('unit_price', '>=', 1000),
    ('unit_price', '<', 2000)
]

2 再使用邏輯非``!``(NOT)把單價在1000到2000之間的 變成 單價不在1000到2000之間的

[
    "|",
    ('product_type', '=', 'service'), 
    '!', '&',
    ('unit_price', '>=', 1000),
    ('unit_price', '<', 2000)
]

總結一下需要注意的點:

  • 邏輯與``&``(AND)在簡單的domain中,可以省略不寫。
  • 邏輯或``|``(OR)要寫在兩個條件之前 ,例如 條件A 或 條件B 要寫成 [ '|' ,條件A,條件B ]
  • 邏輯與``&``(AND)如果不省略,也要寫在兩個條件之前 ,例如 條件A 且 條件B 要寫成 [ '&' ,條件A,條件B ]
  • 邏輯與``&``(AND)在XML中書寫時需要對其進行轉義,例如 條件A 且 條件B 要寫成 [ '&amp;' ,條件A,條件B ]
  • 邏輯非``!``(NOT)一般用在邏輯與``&``(AND)或者 邏輯或``|``(OR)之前。

總結一下三元組中的第二個參數 比較運算符:

 '=', '!=', '<=', '<', '&gt;', '&gt;=', '=?', '=like', '=ilike', 'like', 'not like', 'ilike', 'not ilike', 'in', 'not in', 'child_of'

 在 xml 中書寫時,有些比較運算符需要轉義:

 '=', '!=','&lt;=', '&lt;', '&gt;', '>=', '=?', '=like', '=ilike', 'like', 'not like', 'ilike', 'not ilike', 'in', 'not in', 'child_of'

比較運算符的應用場景,參考:https://www.lmlphp.com/user/1043/article/item/21633/ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章