我想问你是否可以解释Openerp域过滤器的解剖结构。我必须使用它我的项目。 请解释以下域过滤器的说明。
['|',('order_id.user_id','=',user.id),('order_id.user_id','=',False)]
我想知道(order_id.user_id','=',user.id)
的确切含义,order_id
,user_id
和user.id
。他们是否引用任何表格。如果是,那我怎么知道哪一个......
基本上我想知道从下到上解读符号,以便按照我的要求使用它。
答案 0 :(得分:20)
这个很简单。
考虑以下字段(我只在这里给出了XML,你必须管理的是python)
<field name="a"/>
<field name="b"/>
<field name="c"/>
单一条件
考虑编程中的一些简单条件
if a = 5 # where a is the variable and 5 is the value
在Open ERP域过滤器中,它将以这种方式编写
[('a','=',5)] # where a should be a field in the model and 5 will be the value
所以我们得到的语法是
('field_name', 'operator', value)
现在让我们尝试应用另一个字段代替静态值5
[('a','=',b)] # where a and b should be the fields in the model
在上面你要注意的是,第一个变量 a用单引号括起来,而值 b不是。要比较的变量将始终是第一个,并且将用单引号括起来,值将只是字段名称。但是如果你想将变量a与值'b'进行比较,你需要执行以下操作
[('a','=','b')] # where only a is the field name and b is the value (field b's value will not be taken for comparison in this case)
条件和
编程
if a = 5 and b = 10
在Open ERP域过滤器中
[('a','=',5),('b','=',10)]
请注意,如果您未在开头指定任何条件,则将应用和条件。如果要替换静态值,只需删除5并输入字段名称(严格不带引号)
[('a','=',c),('b','=',c)]
条件或
编程
if a = 5 or b = 10
在Open ERP域过滤器中
['|',('a','=',5),('b','=',10)]
请注意,,表示它是和条件。如果您要替换字段,只需删除5并输入字段名称(严格不带引号)
多个条件
编程
if a = 5 or (b != 10 and c = 12)
在Open ERP域过滤器中
['|',('a','=',5),('&',('b','!=',10),('c','=',12))]
此外,来自Arya的post对您有很大帮助。干杯!!
答案 1 :(得分:3)
'|'是一个应用于下一个比较的OR。 (...,'=',False)被转换为IS NULL,因此这个SQL将是
WHERE order_id.user_id = x OR order_id.user_id is NULL
默认为AND,这就是为什么你到处都看不到('&amp;',('field1','=',1),('field2','=',2)。
注意另一个有用的是('field1','!=',False),它被转换为WHERE field1 IS NOT NULL
没有很多很好的文档可供使用,因为你必须通过反向使用运算符来处理元组,因此它们对于多个运算符来说非常棘手。我发现我很少使用复杂的,我只是打开Postgres中的查询记录,并使用反复试验来观察生成的查询,直到我做对了。