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/ 

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