我完全同意您的观点,每次我必须使用这种波兰语符号来完成一个复杂的领域时,我都必须下定决心来管理它。
我认为您要查找的域是:
[’&’, ’|’, ’&’, (’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 EStep 2. => (AB or C) and D and EStep 3. => ABC and D and EStep 4. => ABC and DE
现在我们只有一个运算符,让我们开始重新分解(并将运算符移到每对条件的左侧),然后按照将操作分组的相反顺序(例如,从步骤3到步骤4分组DE,所以现在从第4步到第3步,分解DE并将其运算符移到左侧):
Step 4. => and ABC DEStep 3. => and ABC and D EStep 2. => and or AB C and D EStep 1. => and or and A B C and D E
现在更改运算符,并添加逗号,引号和括号:
[’&’, ’|’, ’&’, A, B, C, ’&’, D, E]
最后,将字母替换为条件,然后您便拥有了域。最好面对面解释它,但也许您能够理解所有内容。
注意:我不会删除&运算符(即使您不编写运算符,odoo也会默认使用它们),因为我的经验是在最大的域中,如果不编写&,则该域无效。我猜这是在存在许多嵌套条件的情况下发生的,但是我的建议是始终编写它们。
解决方法有人可以将以下波兰语表示法转换为与其对应的SQL:
[’|’,’&’,(’is_company’,’=’,True),(’parent_id’,False),(’company_name’,’!=’,’’)]
我的猜测是:
is_company = True OR parent_id = False AND company_name <> False ANDcompany_name <> ’’
无论我多么努力地理解它,我都无法理解这种表示法的概念。请帮忙。
更新
我试图将上述表示法扩展为:
((is_company = True AND parent_id = False) OR company_name <> False) ANDcompany_name <> ’’ AND customer_type_id <> False