Si has pasado algún tiempo configurando Odoo, probablemente te hayas encontrado con expresiones de dominio. Esas condiciones de filtro llenas de corchetes aparecen en botones de acción, reglas automatizadas, reglas de registro y plantillas de correo electrónico en toda la plataforma. Pero menos personas se dan cuenta de que Odoo también proporciona un tipo de campo de dominio en su ORM, diseñado específicamente para almacenar y mostrar estas expresiones como datos estructurados.
Entender los campos de dominio es importante, ya seas un desarrollador de Odoo construyendo módulos personalizados o un usuario empresarial configurando flujos de trabajo automatizados. Esta guía cubre todo, desde lo que realmente almacena un campo de dominio hasta ejemplos prácticos, consejos de desarrollo y los errores más comunes que se deben evitar.
¿Qué es el campo de dominio en Odoo?
En Odoo, un dominio es una lista de condiciones de filtro utilizadas para consultar registros. Sigue una sintaxis específica utilizando tuplas y operadores lógicos, y se mapea directamente a las cláusulas WHERE de SQL cuando Odoo ejecuta una consulta a la base de datos.
Una expresión de dominio típica se ve así:
[('customer_rank', '>', 0), ('active', '=', True)]
Esto se traduce a: devolver todos los registros donde customer_rank es mayor que 0 Y active es Verdadero.
El campo Dominio (fields.Domain) es un tipo de campo en el ORM de Odoo que almacena estas expresiones como datos estructurados dentro de un registro. A diferencia de un campo de texto simple, viene con validación incorporada y un widget de interfaz de usuario dedicado que permite a los usuarios construir condiciones de filtro visualmente, sin escribir ningún código.
Cómo aparece en la interfaz
En la interfaz de Odoo, un campo Dominio se representa utilizando el widget del editor de dominio por defecto. Este widget presenta un constructor de reglas visual donde los usuarios pueden elegir un campo, seleccionar un operador (igual, contiene, mayor que, y así sucesivamente), e ingresar un valor. Es la misma interfaz que ves al configurar reglas de acceso o criterios de filtro en acciones automatizadas.
En la base de datos, los valores de dominio se almacenan como texto plano, específicamente como la representación en cadena de una lista de Python. El tipo de campo maneja la serialización y validación de manera transparente, por lo que los desarrolladores trabajan con valores de dominio limpios en Python mientras que la capa de almacenamiento se encarga del resto.
Esto es parte del diseño más amplio del modelo de datos de Odoo: los campos no son solo contenedores de almacenamiento. Llevan significado semántico, comportamiento de UI y lógica de validación juntos en una sola definición.
Cómo funciona el campo
El campo Dominio se integra estrechamente con el ORM de Odoo y el sistema de filtrado de registros. Aquí está lo que sucede detrás de escena cuando guardas y evalúas un dominio.
Almacenamiento y representación
Cuando un dominio se guarda en la base de datos, Odoo lo almacena como una cadena serializada. Un dominio que restringe registros al estado de borrador para el usuario actual se almacena como un valor de texto que Odoo evalúa en el momento de la consulta. La variable especial uid se resuelve al ID del usuario actual en tiempo de ejecución, lo que hace posible el filtrado dinámico sin codificar valores.
El ORM de Odoo toma esa cadena, la evalúa de manera segura y la convierte en una cláusula WHERE de SQL. Esta evaluación ocurre a través de safe_eval, que soporta un subconjunto controlado de expresiones de Python junto con variables de contexto específicas de Odoo.
El widget de dominio
En la interfaz de Odoo, los campos de tipo fields.Domain utilizan el widget de dominio por defecto. Este widget presenta el constructor de filtros que ves en muchas partes de Odoo. Los usuarios pueden agregar condiciones, combinarlas con lógica AND u OR, y previsualizar resultados sin tocar ningún código.
El widget es lo que hace que los campos de dominio sean realmente accesibles para los usuarios de negocio. No necesitas entender la sintaxis de dominio para configurar un filtro. El constructor visual se encarga de la traducción por ti.
Contexto del modelo
Un campo de dominio puede estar vinculado a un modelo específico, que le dice a Odoo qué campos ofrecer en el constructor de dominio. Esto se establece a través del atributo model_field en la definición del campo. Sin un contexto de modelo, el widget de dominio recurre a una entrada de texto simple, que es mucho menos útil para los usuarios finales.
Este enlace de contexto es una parte fundamental de cómo el marco de Odoo conecta las definiciones de campo con el comportamiento de la interfaz de usuario. El campo conoce el modelo que filtra, y la interfaz se adapta en consecuencia.
Interacción con otros registros
Los campos de dominio se utilizan a menudo junto con campos relacionales para restringir qué registros aparecen en un desplegable Many2one, para definir qué registros un acción automatizada tiene como objetivo, o para establecer el alcance de un informe o un panel. La expresión de dominio actúa como un filtro en vivo aplicado a nivel de ORM, lo que significa que respeta las reglas de seguridad de Odoo y los controles de acceso a los campos.
Casos de uso empresarial
Los campos de dominio aparecen en prácticamente todos los módulos de Odoo. Aquí hay cinco ejemplos del mundo real que muestran cómo impulsan flujos de trabajo comerciales prácticos.
1. Acciones automatizadas y disparadores de correo electrónico
Cuando configuras una acción automatizada en Odoo (Configuración > Técnico > Automatización), defines un dominio para especificar qué registros activan la acción. Por ejemplo, un correo electrónico automatizado para facturas vencidas podría dirigirse solo a facturas publicadas que están impagas y pasadas su fecha de vencimiento. Este dominio se almacena directamente en el modelo base.automation en un campo de dominio llamado filter_domain. La acción solo se activa para los registros que coinciden.
2. Reglas de registro y control de acceso
Las reglas de registro de seguridad de Odoo utilizan campos de dominio para restringir qué registros un grupo de usuarios puede ver o editar. Una regla del equipo de ventas podría limitar la visibilidad a los registros asignados al equipo del usuario actual, evaluado en el momento de la consulta. Esto te proporciona seguridad a nivel de fila sin necesidad de escribir código personalizado. Cada filtro en cada regla de registro en Odoo es una expresión de dominio almacenada en un campo de dominio.
3. Filtrado de inventario y operaciones
En la gestión de almacenes e inventarios, las acciones programadas y las reglas de reorden utilizan dominios para dirigirse a categorías de productos específicas, ubicaciones o niveles de stock. Una acción de reabastecimiento automatizada puede estar limitada a productos almacenables con cantidad disponible en o por debajo de un punto de reorden, evitando un procesamiento innecesario a través de miles de registros.
4. Pipeline de CRM y calificación de leads
En el módulo de CRM, la automatización de etapas del pipeline, las reglas de actividad y la asignación de leads dependen de expresiones de dominio para categorizar y calificar leads. Las reglas de asignación de leads personalizadas utilizan dominios para emparejar leads con el vendedor adecuado según el país, la industria o el tamaño del trato. El campo de dominio es lo que hace que estas reglas sean configurables desde la interfaz en lugar de requerir cambios de código para cada nuevo escenario.
5. Desplegables Many2one dinámicos
En formularios personalizados, un dominio aplicado a un campo Many2one controla qué registros aparecen en el desplegable. Restringir un campo de proveedor para mostrar solo proveedores activos con un rango de proveedor distinto de cero crea experiencias de usuario más enfocadas y reduce errores de entrada. El dominio incluso puede ser dinámico, haciendo referencia a valores de otros campos en el mismo formulario, lo que hace que las opciones disponibles cambien según las selecciones del usuario.
Creando o personalizando el campo
Hay dos enfoques principales para trabajar con campos de Dominio en Odoo: usar Odoo Studio para personalización sin código, o escribir Python y XML en un módulo personalizado.
Usando Odoo Studio
Odoo Studio actualmente no expone un tipo de campo Dominio independiente en su creador de campos visual. Para la mayoría de las necesidades de configuración empresarial, no necesitas uno. Los editores de dominio existentes integrados en acciones automatizadas, reglas de registro y acciones del servidor te ofrecen el constructor de dominio visual sin requerir un campo personalizado.
Si deseas agregar un filtro de dominio a un campo Many2one en un formulario, puedes hacerlo en Studio editando las propiedades del campo e ingresando una expresión de dominio directamente. Studio valida la sintaxis del dominio y la almacena en la definición de la vista.
Personalización técnica en Python
En un módulo Odoo personalizado, agregar un campo de Dominio es una parte sencilla de la guía del desarrollador de odoo estándar. Aquí hay un ejemplo básico usando el ORM:
from odoo import models, fields
class MyModel(models.Model):
_name = 'my.model'
model_name = fields.Char(default='res.partner')
filter_domain = fields.Domain(
string='Filter Domain',
model_field='model_name',
help='Expresión de dominio para filtrar registros de socios'
)
El atributo model_field vincula el editor de dominio con el nombre del modelo almacenado en model_name. Esto le indica al widget de dominio qué campos ofrecer en el constructor visual. Mantener el nombre del modelo en un campo separado también permite la selección dinámica del modelo si su caso de uso lo requiere.
Añadiendo el widget a una vista de formulario
Para mostrar el constructor de dominio en una vista de formulario, haga referencia tanto al campo del modelo como al campo del dominio en el XML de la vista:
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Sin la declaración widget="domain" y la opción del modelo, el campo se renderiza como texto plano. Siempre incluya ambos al construir formularios que expongan la configuración del dominio a los usuarios.
Escribiendo valores de dominio a través de la API XML-RPC
Si está configurando valores de campo de dominio programáticamente a través de la API, siempre pase el valor como una cadena:
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
Pasar un objeto de lista de Python en lugar de una cadena es un error común que causa errores o fallos silenciosos dependiendo de la versión de Odoo. Siempre serialice su dominio a una cadena antes de escribirlo a través de la API.
Mejores prácticas
Estos hábitos prácticos le ahorrarán tiempo y evitarán problemas al trabajar con campos de dominio en Odoo.
Valide la sintaxis del dominio antes de implementar
Una expresión de dominio no válida genera errores en el momento en que Odoo intenta evaluarla. Pruebe sus dominios en la barra de búsqueda de Odoo o en modo desarrollador antes de guardarlos en acciones automatizadas o reglas de registro. Una rápida llamada a search_count a través de la API también es una forma confiable de confirmar que un dominio devuelve el número esperado de registros.
Utiliza variables dinámicas siempre que sea posible
Evita codificar de forma rígida los IDs de usuario, los IDs de empresa o las fechas en las expresiones de dominio. Utiliza variables dinámicas como uid, context_today() y current_company_id en su lugar. Esto mantiene tus dominios portátiles y evita fallos silenciosos cuando los registros cambian entre entornos.
Siempre vincula el contexto del modelo
Al añadir un campo de Dominio a un modelo personalizado, siempre establece el atributo model_field e inclúyelo en la vista. Sin él, los usuarios ven un campo de texto plano en lugar del generador de dominios visual, lo que reduce la usabilidad y aumenta la posibilidad de que se guarden valores inválidos.
Mantén los dominios legibles
Los dominios complejos anidados que utilizan | (O) y & (Y) pueden volverse difíciles de leer y mantener. Agrega comentarios en tu código Python explicando la intención detrás de cada dominio. Si un dominio se vuelve muy complejo, considera si una acción del servidor o un campo computado serían más claros y más fáciles de probar.
Utiliza safe_eval para la evaluación programática
Al evaluar cadenas de dominio en código Python, por ejemplo, dentro de una acción del servidor o acción automatizada, utiliza safe_eval de Odoo en lugar de eval nativo de Python. Es más seguro, maneja correctamente las variables de contexto específicas de Odoo y es consistente con la forma en que Odoo evalúa dominios internamente.
Prueba con datos realistas
Siempre verifica que tu dominio coincida con los registros esperados antes de entrar en producción. Esto es especialmente importante para acciones automatizadas y reglas de registro, donde un filtro incorrecto puede procesar los registros equivocados o bloquear el acceso del usuario sin ninguna advertencia visible.
Errores comunes
Aquí están los errores que más a menudo surgen al trabajar con campos de dominio en Odoo, y cómo evitarlos.
Confundir el tipo de campo con la sintaxis del dominio
{'segment': 'La palabra "dominio" significa dos cosas diferentes en Odoo. Se refiere a la sintaxis de filtro (una lista de tuplas), y también se refiere a fields.Domain, un tipo de campo ORM específico que almacena esas expresiones como datos. Los recién llegados a la personalización de Odoo a menudo confunden los dos. Un campo de Dominio es un contenedor de almacenamiento. La expresión de dominio es la lógica de filtro dentro de él.'}
{'segment': 'Pasar una lista en lugar de una cadena a través de la API'}
{'segment': 'Al escribir en un campo de Dominio a través de XML-RPC, debes pasar una cadena, no un objeto de lista de Python. Pasar el dominio como una lista sin procesar causará un error de tipo o un fallo silencioso dependiendo de la versión de Odoo. Siempre serializa tu dominio a una cadena antes de escribirlo a través de la API.'}
{'segment': 'Falta de contexto del modelo en el widget'}
{'segment': 'Si agregas un campo de Dominio a una vista de formulario sin especificar el contexto del modelo en las opciones del widget, los usuarios verán un campo de texto plano en lugar del generador de dominio visual. El generador de dominio solo aparece cuando el widget sabe a qué modelo referirse. Siempre incluye el enlace model_field en la definición de tu vista.'}
{'segment': 'Codificación rígida de IDs de registros en dominios'}
{'segment': 'Los dominios que hacen referencia a IDs de registros específicos directamente se rompen silenciosamente cuando esos registros son eliminados o cuando copias la configuración a una nueva base de datos. Utiliza referencias dinámicas como uid o búsquedas relacionales siempre que sea posible para mantener tus dominios portátiles.'}
{'segment': 'Dominios de reglas de registro demasiado amplios o restrictivos'}
{'segment': 'Un dominio de regla de registro que es demasiado permisivo puede exponer registros a usuarios que no deberían verlos. Uno que es demasiado restrictivo puede ocultar silenciosamente registros sin ninguna explicación al usuario. Siempre prueba los dominios de reglas de registro desde la perspectiva del grupo de usuarios objetivo, no desde la cuenta de administrador que elude todas las reglas.'}
{'segment': 'Olvidando registros archivados'}
{'segment': "Por defecto, Odoo excluye registros archivados (donde active = False) de los resultados de búsqueda. Si tu dominio no tiene en cuenta esto, puedes obtener huecos inesperados en tus datos. Agrega ('active', 'in', [True, False]) cuando necesites incluir registros archivados en los resultados del filtro."}
Conclusión
{'segment': 'Los campos de Dominio son uno de esos bloques de construcción que silenciosamente alimentan gran parte de cómo funciona Odoo. Desde el control de acceso y acciones automatizadas hasta menús desplegables dinámicos y filtros de panel, las expresiones de dominio son la columna vertebral del filtrado de registros en Odoo, y el tipo fields.Domain ofrece a los desarrolladores una forma limpia y validada de almacenar y presentar esa lógica directamente en el modelo de datos de Odoo.'}
Para los usuarios empresariales, el widget de dominio hace que la configuración de filtros sea accesible sin necesidad de código. Para los desarrolladores, el tipo de campo Dominio aporta claridad a las definiciones de modelo que antes dependían de campos Char genéricos con una sobrecarga de widget. Ya sea que estés trabajando en Odoo Studio, escribiendo un módulo personalizado en Python, o configurando flujos de trabajo automatizados desde la interfaz, entender cómo funcionan los campos de dominio abre un amplio rango de posibilidades.
Los conceptos cubiertos en esta guía se aplican a través de las versiones y módulos de Odoo. El tiempo dedicado a entender los campos de dominio es tiempo bien invertido, porque están genuinamente en todas partes en Odoo.
¿Necesitas ayuda con tu implementación de Odoo?
Dasolo ayuda a las empresas a implementar, personalizar y optimizar Odoo para sus necesidades empresariales específicas. Ya sea que estés configurando flujos de trabajo automatizados, construyendo módulos personalizados, o tratando de sacar más provecho de tu configuración existente de Odoo, nuestro equipo tiene la profundidad técnica para ayudarte a avanzar con confianza.
Si tienes preguntas sobre los campos de Dominio o cualquier otro aspecto de tu implementación de Odoo, contáctanos. Estamos encantados de echar un vistazo a tu configuración y orientarte en la dirección correcta.