了解OpenERP域名过滤器?

man*_*eer 7 odoo

我想问你是否可以解释Openerp域过滤器的解剖结构.我必须使用它我的项目.请解释以下域过滤器的说明.

['|',('order_id.user_id','=',user.id),('order_id.user_id','=',False)]
Run Code Online (Sandbox Code Playgroud)

我想知道的确切含义(order_id.user_id','=',user.id)是什么order_id,user_iduser.id.他们是否引用任何表格.如果是,那么我该怎么知道哪一个......

基本上我想知道从下到上解读符号,以便可以按照我的要求使用它.

Viv*_*vek 20

这个很简单.

考虑以下字段(这里只提供XML,你需要管理的python)

<field name="a"/>
<field name="b"/>
<field name="c"/>
Run Code Online (Sandbox Code Playgroud)

单一条件

考虑编程中的一些简单条件

if a = 5  # where a is the variable and 5 is the value
Run Code Online (Sandbox Code Playgroud)

在Open ERP域过滤器中,它将以这种方式编写

[('a','=',5)] # where a should be a field in the model and 5 will be the value
Run Code Online (Sandbox Code Playgroud)

所以我们得到的语法是

('field_name', 'operator', value)
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试应用另一个字段来代替静态值5

[('a','=',b)] # where a and b should be the fields in the model
Run Code Online (Sandbox Code Playgroud)

在上面你要注意的是,第一个变量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)
Run Code Online (Sandbox Code Playgroud)

条件和

在编程中

if a = 5 and b = 10
Run Code Online (Sandbox Code Playgroud)

在Open ERP域过滤器中

[('a','=',5),('b','=',10)]
Run Code Online (Sandbox Code Playgroud)

请注意,如果你没有在一开始指定的任何条件情况将被应用.如果要替换静态值,只需删除5并给出字段名称(严格没有引号)

[('a','=',c),('b','=',c)]
Run Code Online (Sandbox Code Playgroud)

条件OR

在编程中

if a = 5 or b = 10
Run Code Online (Sandbox Code Playgroud)

在Open ERP域过滤器中

['|',('a','=',5),('b','=',10)]
Run Code Online (Sandbox Code Playgroud)

请注意,表示它条件.如果你想替换字段,你可以简单地删除5并给出字段名称(严格没有引号)

多个条件

在编程中

if a = 5 or (b != 10 and c = 12)
Run Code Online (Sandbox Code Playgroud)

在Open ERP域过滤器中

['|',('a','=',5),('&',('b','!=',10),('c','=',12))]
Run Code Online (Sandbox Code Playgroud)

来自Arya的这篇文章也将对你有很大帮助.干杯!!


Adr*_*all 3

'|' 是应用于下一个比较的 OR。(..., '=', False) 被转换为 IS NULL,因此 SQL 为

WHERE order_id.user_id = x OR order_id.user_id is NULL
Run Code Online (Sandbox Code Playgroud)

默认值为 AND,这就是为什么您不会到处看到 ('&', ('field1', '=' ,1), ('field2' ,'=', 2) 的原因。

请注意,另一个有用的函数是 ('field1', '!=', False) ,它会转换为 WHERE field1 IS NOT NULL

这方面没有很多很好的文档,而且对于多个运算符来说它们会变得非常棘手,因为您必须通过反向使用运算符来处理元组。我发现我很少使用复杂的查询,因此我只需在 Postgres 中打开查询日志记录,并通过试验和错误观察生成的查询,直到得到正确的结果。