Saltar al contenido

Dominios binarios

🐍 DESARROLLO · ODOO · DOMINIOS DINÁMICOS

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.

🔢
CAMPO BINARIO
Almacena la lista serializada

DINÁMICO
Cambia según el registro / contexto

🧮
COMPUTADO
Calculado en Python en tiempo real

🎯
CASO ESPECÍFICO
No se necesita siempre — solo cuando hace falta

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é?

📦 Soporta tipos complejos
Listas, tuplas, booleanos, números o None — todo nativo Python.

🚫 Char / Text se quedan cortos
No manejan bien estructuras anidadas con valores nativos.

🛡️ Sin eval ni JSON manual
Evita conversiones manuales propensas a errores y problemas de seguridad.

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:

Definición del campo binario en el módulo account

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

Función computada que arma el dominio en Python

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

Vista referenciando el campo binario en el atributo domain
⚙️ QUÉ HACE EL CLIENTE WEB
  1. Detecta que domain no es expresión literal sino el nombre de un campo.
  2. Obtiene el valor del campo tag_ids_domain.
  3. Lo deserializa desde binario.
  4. Lo interpreta como dominio.
  5. 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:

Campo test_partner_id sin dominio mostrando todos los clientes

El código del modelo y la vista:

Definición del campo en Python
Inclusión del campo en la vista XML

Agregar el campo binario computado

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

Definición del campo binario computado test_partner_domain

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:

Cliente Azure Interior con sub-clientes asociados

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:

Función computada que filtra clientes por parent_id = 15

Referenciar el dominio en la vista

Agregamos test_partner_domain dentro del atributo domain del campo test_partner_id:

Vista XML referenciando el campo binario como domain
⚠️ REQUISITO DE ODOO
El campo dominio (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:

Resultado: solo se muestran los 3 clientes asociados a la empresa

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:

Función actualizada filtrando empresas con al menos 2 ventas

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

Lista filtrada por empresas con ≥2 ventas
Detalle del filtrado

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

Verificación: Deco Addict con sus ventas
Verificación: Gemini Furniture con sus ventas
Verificación: Ready Mat con sus ventas
✅ RESULTADO
Cumplimos las restricciones del dominio dinámico usando un campo binario computado. La lógica que era imposible expresar en XML quedó resuelta con unas líneas de Python.

6
Consejos rápidos

💡 No conviertas manualmente
Aunque el campo sea Binary, Odoo lo maneja automáticamente. No serializes ni codifiques a mano: asigna una lista/tupla Python y Odoo se encarga del resto.

💡 Úsalo para casos complejos
Dominios dinámicos que dependen de condiciones basadas en campos computados no almacenados son el caso ideal — donde un dominio XML estándar no llega.

💡 No siempre los necesitas
La gran mayoría de las veces no necesitarás un dominio binario si las condiciones se basan en campos almacenados. Reserva esta técnica para los casos que realmente la justifican.

📌 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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¿Te gustaría implementar Odoo en tu empresa?

12 años de experiencia · +60 implementaciones exitosas · Partner Gold de Odoo en México

Hablemos por WhatsApp