Odoo utiliza la notación polaca para los filtros de dominio.
Dominios
Un dominio es una lista de criterios, cada criterio es un triplete (ya sea una lista o una tupla) de (nombre_campo, operador, valor) donde:
nombre_campo (str)
un nombre de campo del modelo actual, o una relación transversal a través de Many2one usando notación de puntos, p. 'street' o 'partner_id.country'
operador (str)
- Un operador de comparación entre el campo y el valor del criterio.
- Los operadores válidos son =,! =,>,> =, <, <=, Like, ilike, in, not in, child_of, parent_left, parent_right
valor
- Tipo de variable, debe ser comparable (a través del operador) al campo nombrado
- Valor válido para comparar con los valores de field_name, según su tipo
Los criterios de dominio se pueden combinar utilizando operadores lógicos en forma de prefijo:
'&':AND lógico , operación predeterminada para combinar criterios que se siguen uno al otro.
'|': OR lógico
'!': NOT lógico
Consejo: Principalmente para negar combinaciones de criterios, los criterios individuales generalmente tienen una forma negativa (por ejemplo, = ->! =, <->> =) que es más simple que negar lo positivo.
Ejemplos
Para buscar socios llamados ABC, de México o Alemania, cuyo idioma no es el inglés:
[('name','=','ABC'), ('language.code','!=','en_US'), '|',('country_id.code','=','mx'), ('country_id.code','=','de')]
Este dominio es interpretado como:
(name es 'ABC') Y (language NO es inglés) Y (country es México O Alemania)
Cómo escribir diferentes filtros de dominio
1- Condición simple en la programación Odoo:
si campo1 = 10
será escrito en odoo así:
domain = [('campo1', '=', 10)] # donde campo1 debe ser un campo en el modelo y 10 será el valor.
O
domain = [('campo1', '=', campo2)] # donde campo1 y campo2 deben ser los campos en el modelo.
1.1 - Condición AND
si campo1 = 5 y campo2 = 10
En el filtro de dominio Odoo, se escribirá como:
domain = [('campo1', '=', 5), ('campo2', '=', 10)]# donde campo1 y campo2 deben ser un campo en el modelo y 10 y 5 serán el valor.
O
domain = [('campo1', '=', campo3), ('campo2', '=', campo3)] # donde campo1, campo2 y campo3 deben ser los campos en el modelo.
Tenga en cuenta que si no especifica ninguna condición al principio, se aplicará la condición AND.
1.2 - Condición OR
si campo1 = 5 o campo2 = 10
En el filtro de dominio Odoo, se escribirá como:
domain = ['|', ('campo1', '=', 5), ('campo2', '=', 10)]
O
domain = ['|', ('campo1', '=', campo3), ('campo1', '=', campo3)]
2 - Condición compleja en la programación Odoo
2.1- Condición simple:
si campo1 = 5 o (campo2! = 10 y campo3 = 12)
En el filtro de dominio Odoo, se escribirá como:
domain = ['|', ('campo1', '=', 5), ('&', ('campo2', '!=', 10), ('campo3','=',12) )]
2.2- Condición compleja:
Como sabemos, Odoo utiliza la notación polaca para los filtros de dominio.
Si tenemos una condición como esa:( A OR B) AND ( C OR D OR E)
debe convertirse a la notación polaca como AND OR A B OR OR C D E De la siguiente manera:
Deberíamos comenzar por el carácter más a la derecha, es decir, el carácter ")".
Input | Prefix_Stack | Stack |
) | Empty | ) |
E | E | ) |
OR | E | ) OR |
D | ED | ) OR |
OR | ED | ) OR OR |
C | EDC | ) OR OR |
( | EDC OR OR | Empty |
AND | EDC OR OR | AND |
) | EDC OR OR | AND ) |
B | EDC OR OR B | AND ) |
OR | EDC OR OR B | AND ) OR |
A | EDC OR OR B A | AND ) OR |
( | EDC OR OR B A OR | AND |
Empty | EDC OR OR B A OR AND | Empty |
Ahora invirtiendo el resultado final en prefix_stack obtendremos
AND OR A B OR OR CDE ## Como se espera
También puede usar el operador "in" en lugar de escribir tres tuplas separadas con el operador OR como
['&', ('field2', 'in', ['A', 'B']), ('state', 'in', ['open', 'closed', 'draft'])]
Y para verificar los diversos usos de los filtros de dominio en la lista de acciones de Configuración -> Acciones -> Acciones de ventana (Settings > Actions > Window Actions) (el modo desarrollador debe estar activado)
La manera más simple:
(1) Comience con el operador más externo y muévalo al inicio de la expresión.
"(Un operador B)" se convierte en "operador (A B)"
(2) Repita el paso 1 para cada expresión secundaria con un operador para mover.
"A (operador B C)" se convierte en "operador A (operador B C)" y luego "operador A (operador B C)"
(3) Retire todos los soportes
“Operador A (operador B C)” se convierte en “operador A operador B C”
SO para nuestro ejemplo: (A OR B) Y (C OR D OR E) lo convertiremos así:
- Según el paso (1) la expresión será:
Y (A O B) (C O D O E)
- Según el paso (2) la expresión será:
Lado izquierdo: Y (O A B) (C O D O E)
Lado exterior derecho: Y (O A B) (O C (D O E))
Lado interno derecho: Y (O A B) (O C (O D E))
- Según el paso (3) la expresión será (eliminar corchetes):
AND o A B o C o D E
- Según la sintaxis del dominio del abridor, este resultado se escribiría como:
[‘&’, ’|’, (A), (B), ’|’, (C), ‘|’, (D), (E)]
Nota: OpenERP usa la notación de pulido (prefijo), y también podemos usar la notación de pulido inverso (postfix) para escribir filtros de dominio.
Para más información: haga clic aquí
Y solo como ejemplo:
La expresión infija "(3 + 5) * (7 - 2)" se puede escribir así en RPN: 3 5 + 7 2 - *
Nota: La notación invertida es exactamente la misma, pero le permite resolver sin tener que ir y venir.