我完全同意你的观点,每次我必须使用这种波兰符号来做一个复杂的域时,我都必须绞尽脑汁来管理它。
我认为您正在寻找的域是:
['&', '|', '&', ('is_company', '=', True), ('parent_id', '=', False), ('company_name', '!=', False), '&', ('company_name', '!=', ''), ('customer_type_id', '!=', False)]
我制定了一种方法来获取这些复杂的域,并且它正在工作:
首先我写一封信而不是每个条件:
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)
然后只使用字母和标准运算符构建您需要的表达式,忘记波兰符号和条件:
Step 0. => ((A and B) or C) and D and E
然后,将您应该首先执行的操作分组(不要介意到目前为止缺少的操作员):
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
现在我们只有一个运算符,让我们再次开始分解它(并将运算符移动到每个条件的左侧),按照您对操作分组的相反顺序(例如,从第 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
现在更改运算符并添加逗号、引号和方括号:
['&', '|', '&', A, B, C, '&', D, E]
最后,用条件替换字母,您就拥有了您的域。面对面解释会更好,但也许您能够理解所有内容。
注意:我不会删除&
操作符(尽管如果你不写它们,Odoo 应该默认使用它们)因为我的经验是,对于最大的域,如果我没有写&
,那么域就不起作用。我想这发生在有很多嵌套条件时,但我的建议是总是写它们。