我不懂普通波兰表示法(NPN或PN).如何在Odoo中构建复杂的域?

Lek*_*ath 5 python xml polish-notation odoo odoo-10

有人可以将以下波兰表示法转换为其SQL对应物:

['|', '&', ('is_company','=', True),('parent_id', '=', False),('company_name', '!=', False),('company_name', '!=', '')]

我的猜测是:

is_company = True OR parent_id = False AND company_name <> False AND company_name <> ''

无论我多么努力地理解它,我都无法得到这种符号的概念.请帮忙.

UPDATE

我试图将上述表示法扩展为:

((is_company = True AND parent_id = False) OR company_name <> False) AND company_name <> '' AND customer_type_id <> False

for*_*vas 7

我完全同意你的观点,每次我必须使用这种波兰表示法做一个复杂的域名时,我必须绞尽脑汁来管理它.

我认为您正在寻找的域名是:

['&amp;', '|', '&amp;', ('is_company', '=', True), ('parent_id', '=', False), ('company_name', '!=', False), '&amp;', ('company_name', '!=', ''), ('customer_type_id', '!=', False)]
Run Code Online (Sandbox Code Playgroud)

我编写了一个获取这些复杂域的方法,并且它正在工作:

首先,我写了一封信,而不是每个条件:

A => is_company = True => ('is_company', '=', True)
B => parent_id = False => ('parent_id', '=', False)
C => company_name <> False => ('company_name', '!=', False)
D => company_name <> '' => ('company_name', '!=', '')
E => customer_type_id <> False => ('customer_type_id', '!=', False)
Run Code Online (Sandbox Code Playgroud)

然后使用字母和标准运算符构建所需的表达式,忘记波兰表示法和条件:

Step 0. => ((A and B) or C) and D and E
Run Code Online (Sandbox Code Playgroud)

然后,将您应该执行的操作分组(暂时不要介意缺少的操作符):

Step 1. => ((A and B) or C) and D and E
Step 2. => (AB or C) and D and E
Step 3. => ABC and D and E
Step 4. => ABC and DE
Run Code Online (Sandbox Code Playgroud)

现在我们只有一个操作符,让我们再次开始分解它(并将操作符移动到每个条件的左侧),遵循您对操作进行分组的相反顺序(例如,从步骤3到4,您将DE分组,所以现在,从步骤4到3,分解DE并将其运算符移到其左侧):

Step 4. => and ABC DE
Step 3. => and ABC and D E
Step 2. => and or AB C and D E
Step 1. => and or and A B C and D E
Run Code Online (Sandbox Code Playgroud)

现在更改运算符并添加逗号,引号和括号:

['&amp;', '|', '&amp;', A, B, C, '&amp;', D, E]
Run Code Online (Sandbox Code Playgroud)

最后,用条件替换字母,并在那里有你的域名.最好是面对面地解释它,但也许你能够理解一切.

注意:我不删除&amp;运算符(尽管如果你不编写它们,Odoo应该默认使用它们)因为我的经验是,对于最大的域,如果我没有写&amp;,那么域不起作用.我猜这种情况发生在有很多嵌套条件的时候,但我的建议是永远写下它们.

  • 你真的不需要第一个 `&amp;`,因为 `&amp;` 是默认操作符 (2认同)