Dominios binarios en Odoo
Cuando un dominio depende de campos computados no almacenados o de lógica que no puede expresarse en una expresión literal de XML, los fields.Binary entran en juego: Odoo serializa la lista de tuplas en binario y la usa como fuente del atributo domain de la vista. Aquí explicamos qué son, cómo se usan y un ejemplo paso a paso.
1
¿Qué es un dominio binario?
“Dominio binario” se refiere a la práctica de utilizar campos de tipo binario para definir dominios dinámicos de otros campos a través de las vistas. Resulta confuso al principio porque normalmente los dominios se expresan como listas Python o expresiones tipo Odoo — pero aquí se almacenan como un fields.Binary porque almacenan objetos Python serializados.
2
¿Por qué se almacena en binario?
Odoo permite que el atributo domain de una vista se cargue desde un campo del modelo, en lugar de ser estático en XML. Ese campo debe contener una estructura Python serializable, típicamente una lista de tuplas:
[('campo', 'operador', valor), ('otro_campo', 'in', lista_valores)]
Para representarlo en la base de datos, Odoo lo serializa con pickle/base64 dentro de un fields.Binary. ¿Por qué?
Por eso Odoo serializa el objeto Python en binario y lo guarda en fields.Binary. Luego la vista lee el contenido y lo interpreta como dominio en tiempo real.
3
Ejemplo dentro de Odoo: el módulo account
El módulo account (Contabilidad) usa esta técnica. Define un campo binario:

Y dentro de su función computada construye dinámicamente la lista de tuplas:

Ese campo se utiliza luego como domain del campo tag_ids desde la vista:

- Detecta que
domainno es expresión literal sino el nombre de un campo. - Obtiene el valor del campo
tag_ids_domain. - Lo deserializa desde binario.
- Lo interpreta como dominio.
- Aplica ese dominio dinámico al campo
tag_ids.
4
Ejemplo paso a paso: campo Cliente con dominio dinámico
Construyamos uno desde cero. Agregamos el campo test_partner_id en cotizaciones (un Many2one a res.partner). Sin restricciones, muestra todos los clientes:

El código del modelo y la vista:


Agregar el campo binario computado
Dentro del mismo modelo agregamos test_partner_domain de tipo binario y computado. Aquí construiremos dinámicamente las restricciones:

Datos de prueba: Azure Interior (id=15)
En la base demo de Odoo existe el cliente “Azure Interior” (tipo empresa, id=15) con varios clientes asociados a través del campo parent_id:

Construir el dominio dentro de la función
Queremos que el dominio sea: “todos los clientes asociados a Azure Interior”. La función computada arma la lista de tuplas:

Referenciar el dominio en la vista
Agregamos test_partner_domain dentro del atributo domain del campo test_partner_id:

test_partner_domain) debe declararse antes en la vista que el campo que lo usa (test_partner_id). Si no, Odoo no lo encuentra al renderizar y falla en runtime.Al actualizar el módulo, el campo “Cliente (prueba)” solo permite seleccionar uno de los 3 clientes asociados a Azure Interior:

5
Caso más complejo: empresas con al menos 2 ventas
Aquí está donde brillan los dominios binarios. Supongamos que queremos: “todos los clientes asociados a una empresa que tenga al menos 2 ventas relacionadas”. La complejidad: el campo sale_order_count en res.partner es computado pero no almacenado — no se puede usar directamente en un dominio XML estándar.
La función computada cambia para hacer ese pre-cálculo en Python y armar la lista de IDs filtrados:

Al actualizar el módulo y revisar el campo, vemos solo clientes asociados a las empresas “Deco Addict”, “Gemini Furniture” y “Ready Mat”:


Verificando contra el sistema, las tres empresas efectivamente cumplen la condición de ser tipo “Empresa” con al menos 2 ventas asociadas:



6
Consejos rápidos
📌 En resumen
Los dominios binarios son la herramienta correcta cuando un dominio dinámico no se puede expresar en XML porque depende de cálculos en Python o campos computados no almacenados. Se definen como fields.Binary computado, se referencian en la vista como nombre del campo en domain, y Odoo se encarga de la deserialización.
No abuses de ellos: para condiciones simples sobre campos almacenados, los dominios XML estándar son más mantenibles. Pero cuando necesitas la potencia de Python en runtime, esta es la forma correcta. En Exdoo los aplicamos en módulos a medida cuando la lógica de negocio lo exige — y compartimos contenido técnico para ayudar a la comunidad de developers Odoo.
Deja un comentario