摘抄自源碼 /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 要寫成 [ '&' ,條件A,條件B ]
- 邏輯非``!``(NOT)一般用在邏輯與``&``(AND)或者 邏輯或``|``(OR)之前。
總結一下三元組中的第二個參數 比較運算符:
'=', '!=', '<=', '<', '>', '>=', '=?', '=like', '=ilike', 'like', 'not like', 'ilike', 'not ilike', 'in', 'not in', 'child_of'
在 xml 中書寫時,有些比較運算符需要轉義:
'=', '!=','<=', '<', '>', '>=', '=?', '=like', '=ilike', 'like', 'not like', 'ilike', 'not ilike', 'in', 'not in', 'child_of'
比較運算符的應用場景,參考:https://www.lmlphp.com/user/1043/article/item/21633/