摘抄自源码 /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/