Dominios binarios

En este blog exploraremos cómo funcionan los dominios binarios para construir dominios dinámicos, por qué se utilizan y cómo puedes implementarlos paso a paso en tus propios desarrollos, conservando la estructura nativa de los dominios y evitando conversiones engorrosas.

Daniel Sánchez

11/25/20255 min read

¿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 vistas. Esto puede resultar confuso porque normalmente los dominios se expresan como listas Python o expresiones tipo Odoo, pero en este caso se almacenan como un campo tipo binario porque almacenan objetos Python serializados.

¿Por qué un dominio puede almacenarse en un campo tipo binario?

Odoo permite que el atributo domain de una vista (XML) se pueda cargar desde un campo del modelo, en lugar de ser estático en el XML. Ese campo debe contener una estructura Python serializable, usualmente una lista de tuplas como:

[('campo', 'operador', valor), ('otro_campo', 'in', lista_valores)]

Para representarlo en la base de datos, Odoo lo serializa usando pickle/base64 en un fields.Binary, porque:

  • El dominio debe poder almacenar listas, tuplas, booleanos, números o None.

  • Un campo tipo Char o Text no soportaría bien objetos complejos o valores nativos.

  • Se quiere evitar transformación manual a JSON o eval.

Por eso, Odoo serializa el objeto Python en binario y lo guarda en fields.Binary.

Luego, la vista simplemente lee el contenido y lo interpreta como dominio.

Ejemplos de dominios binarios dentro de Odoo

El módulo account (Contabilidad) agrega el siguiente campo:

Cuyo valor calculado dentro de su función es el siguiente:

Y este campo se utiliza como dominio del campo “tag_ids” desde la vista:

Aquí Odoo detecta que domain no es una expresión literal, sino el nombre de un campo en el modelo. Entonces el cliente web hace lo siguiente:

  1. Obtiene el valor del campo tag_ids_domain

  2. Lo deserializa desde binario.

  3. Lo interpreta como un dominio.

  4. Aplica dicho dominio dinámico al campo tag_ids.

Ejemplo de dominio binario

Supongamos que agregamos el campo test_partner_id en las cotizaciones donde seleccionamos un cliente (res.partner). Sin tener ninguna restricción sobre su dominio, el campo se visualiza de la siguiente manera:

Cuyo código tiene la siguiente estructura:

Dentro del archivo Python anterior, agregamos el campo test_partner_domain, tipo binario y computado.

Dentro de nuestra base con datos demo tenemos el cliente “Azure Interior” de tipo empresa, cuyo id es 15, donde otros clientes están asociados a esta empresa (relación que se establece dentro del campo parent_id).

Supongamos que queremos que el dominio sean todos los clientes que están asociados a esta empresa. Entonces, dentro de la definición de la función del campo computado anterior, hacemos lo siguiente:

Ahora que definimos nuestro dominio binario, agregamos este mismo campo dentro del atributo domain del campo test_partner_id que agregamos dentro de las cotizaciones. Agregamos el atributo desde vista de la siguiente manera:

Notemos cómo agregamos el campo dominio (test_partner_domain) antes de utilizarlo dentro del atributo domain del campo “Cliente (prueba)” (test_partner_id) que agregamos dentro de las cotizaciones, esto ya que es requerimiento de Odoo agregar desde vista un campo antes de utilizarlo dentro de los atributos de otro campo. Al actualizar nuestro módulo observamos lo siguiente:

De esta forma agregamos el dominio a nuestro campo “Cliente (prueba)” utilizando un campo binario computado. Solo podemos seleccionar uno de los 3 clientes asociados a la empresa “Azure Interior”, cuyo id es 15.

Hagamos algo más interesante. Supongamos que ahora queremos todos los clientes que estén asociados a una empresa, pero que esta empresa tenga al menos 2 ventas relacionadas. En este último punto es donde radica la complejidad del dominio, ya que para obtener las ventas relacionadas a un cliente se necesita el campo “Número de órdenes de venta” (sale_order_count), el cual está dentro del modelo de clientes (res.partner) y es computado, pero no almacenado. La definición de nuestra función cambia de la siguiente manera:

Por lo que al actualizar el módulo y volviendo a revisar nuestro campo que agregamos en cotizaciones, observamos lo siguiente:

Notamos como solo nos muestra clientes asociados a las empresas “Deco Addict”, “Gemini Furniture” y “Ready Mat”. Verificando estos clientes dentro del sistema notamos que, en efecto, con clientes de tipo ‘Empresa’ que tienen al menos 2 ventas asociadas.

Por lo que se cumplieron las restricciones de nuestro dominio al agregarlas dentro de un campo binario computado.

Consejos rápidos:

  • Aunque el campo sea Binary, Odoo lo maneja automáticamente; no debes convertirlo ni codificarlo manualmente. Simplemente asignas una lista/tupla Python y Odoo se encarga del resto.

  • Utiliza estos campos para crear dominios dinámicos complejos, por ejemplo, los que dependen de condiciones basadas en campos computados no almacenados.

  • La gran mayoría de las veces no necesitarás de un dominio binario si las condiciones se basan en campos que se almacenan dentro de la base de datos.

En Exdoo podemos desarrollar cualquier módulo para Odoo en México; implementamos tu ERP con consultores experimentados no solo en Odoo, sino en procesos de negocios; tenemos 10 años trabajando solamente con Odoo en México y otros países.