Ir al contenido

Campos Domain en Odoo: Guía Completa y Práctica

Descubre qué es el campo Domain en Odoo, dónde se emplea y cómo integrarlo correctamente en tu modelo de datos y personalizaciones. Aprenderás a controlar qué registros se muestran mediante filtros dinámicos, a aplicarlo en vistas y relaciones, y a aprovecharlo para crear reglas de selección precisas y reutilizables en módulos y personalizaciones.
6 de marzo de 2026 por
Campos Domain en Odoo: Guía Completa y Práctica
Dasolo
| Sin comentarios aún

Si alguna vez has configurado Odoo, seguro que te has topado con expresiones tipo "domain": esos filtros entre corchetes que aparecen en botones, reglas automáticas, reglas de registro y plantillas de correo. Lo que no es tan conocido es que Odoo ofrece un tipo de campo específico en su ORM —fields.Domain— pensado para almacenar y mostrar esas expresiones como datos estructurados, con validación y un editor visual nativo.


Comprender qué es y cómo se usa el campo Domain es útil tanto para desarrolladores que crean módulos a medida como para usuarios de negocio que montan flujos automatizados. En este texto encontrarás desde qué guarda exactamente el campo hasta ejemplos prácticos, cómo implementarlo y las trampas más habituales a evitar.

¿Qué es el campo Domain en Odoo


En Odoo, un domain es una lista de condiciones que filtra registros. Tiene una sintaxis propia basada en tuplas y operadores lógicos, y cuando Odoo ejecuta la consulta esa lista se traduce a la cláusula WHERE de SQL.

Un ejemplo habitual de dominio sería el siguiente:


[('customer_rank', '>', 0), ('active', '=', True)]

En palabras sencillas: devuelve los registros cuyo customer_rank sea mayor que 0 Y que además estén activos (active = True).


El campo Domain (fields.Domain) es un tipo de campo del ORM que guarda estas expresiones como datos estructurados dentro de un registro. A diferencia de un Char, incorpora validación y se muestra con un widget que permite construir filtros visualmente sin escribir sintaxis manual.


Cómo se muestra en la interfaz

En la interfaz de Odoo, un campo Domain se representa por defecto con el editor de dominios. Ese widget ofrece un generador visual donde eliges el campo, el operador (es igual a, contiene, mayor que, etc.) y el valor. Es el mismo editor que aparece al configurar reglas de acceso o criterios en acciones automatizadas.


En la base de datos, los valores del domain se guardan como texto: la representación en cadena de una lista Python. El tipo de campo se encarga de la serialización y la validación, de modo que en Python trabajas con dominios limpios y la capa de almacenamiento se ocupa del resto.

Esto ilustra una idea clave del modelo de datos de Odoo: un campo no es solo un hueco para guardar texto; define comportamiento UI, significado semántico y reglas de validación en una sola declaración.

Cómo funciona el campo


Integración con el ORM y evaluación


Qué ocurre bajo el capó

Cuando guardas un domain, Odoo lo persiste como una cadena serializada. Un dominio que limite a borradores para el usuario actual se almacena como texto y se interpreta en el momento de la consulta; variables especiales como uid se resuelven en tiempo de ejecución para dotar de dinamismo al filtro.

Al ejecutar la búsqueda, el ORM toma esa cadena, la evalúa de forma segura y la convierte en la cláusula WHERE de SQL. La evaluación se realiza con safe_eval, que admite un subconjunto controlado de Python junto a variables de contexto específicas de Odoo.


El widget de dominios

En la interfaz, los campos fields.Domain usan por defecto el widget de dominio: el constructor visual que permite combinar condiciones con AND/OR y ver una vista previa sin tocar código.

Ese widget es lo que hace accesibles los dominios a los usuarios de negocio: no hace falta aprender la sintaxis, el editor visual se encarga de traducir la lógica por ti.


Contexto del modelo

Un campo Domain puede vincularse a un modelo concreto para que el editor sepa qué campos ofrecer al construir la condición. Esto se configura con el atributo model_field en la definición del campo. Si no hay contexto de modelo, el widget cae a un input de texto plano, menos útil para usuarios finales.


Vincular contexto es parte del diseño del framework de Odoo: la definición del campo comunica al UI qué datos puede filtrar y la interfaz adapta su comportamiento en consecuencia.


Interacción con otros registros

Los campos Domain se usan frecuentemente con campos relacionales para limitar los elementos de un desplegable Many2one, definir el objetivo de una acción automática o acotar el alcance de un informe. La expresión se aplica en el nivel del ORM, por lo que respeta permisos y reglas de acceso de Odoo.

Casos de uso en la empresa


Dónde los verás en la práctica


Aparecen en casi todos los módulos de Odoo. A continuación tienes cinco ejemplos reales de cómo se usan en flujos de negocio concretos.

1. Acciones automáticas y correos disparados


Al crear una acción automática (Ajustes > Técnico > Automatización) defines un domain que decide qué registros disparan la acción. Por ejemplo, un correo de facturas vencidas puede aplicarse sólo a facturas publicadas, impagadas y con vencimiento pasado. Ese filtro se almacena en base.automation en un campo Domain llamado filter_domain y la acción solo se ejecuta para registros que cumplan esa condición.

2. Reglas de registro y control de acceso


Las reglas de seguridad usan dominios para limitar qué registros ve o edita un grupo de usuarios. Una regla para el equipo de ventas puede restringir la visibilidad a registros asignados al equipo del usuario actual, evaluada en tiempo de consulta. Es una seguridad a nivel de filas sin tener que escribir código específico.

3. Filtrado en logística e inventario


En almacén, acciones programadas y reglas de reaprovisionamiento emplean dominios para dirigirse a categorías, ubicaciones o niveles de stock concretos. Por ejemplo, una acción de reabastecimiento puede limitarse a productos almacenables cuyo stock esté en o por debajo del punto de pedido, evitando procesar miles de registros innecesarios.

4. Pipeline de CRM y cualificación de leads


En CRM las automatizaciones de etapas, reglas de actividad y asignación de leads usan dominios para clasificar y asignar oportunidades. Reglas de asignación pueden enlazar leads al comercial correcto según país, sector o tamaño de la operación, permitiendo configurar la lógica desde la interfaz en lugar de tocar código.

5. Desplegables Many2one dinámicos

Crear o personalizar el campo


En formularios personalizados, un domain en un Many2one controla qué registros aparecen en el desplegable. Restringir proveedores a los activos con supplier_rank > 0 mejora la experiencia y reduce errores. Además, el dominio puede ser dinámico y depender de otros campos del formulario, adaptando las opciones según la selección del usuario.


Cómo crear y modificar campos Domain

Hay dos rutas principales: usar Odoo Studio para cambios sin código o desarrollar el campo en un módulo con Python y XML.

Con Odoo Studio


Studio no expone actualmente un creador visual para fields.Domain como tipo independiente, pero en la mayoría de configuraciones no es necesario. Los editores de dominio integrados en acciones automáticas, reglas y server actions ya ofrecen el constructor visual sin requerir un campo adicional.

Si necesitas aplicar un dominio a un Many2one en un formulario, Studio permite introducir la expresión en las propiedades del campo; valida la sintaxis y la guarda en la vista.

Personalización técnica en Python

En un módulo personalizado añadir un campo Domain es sencillo y forma parte de la práctica habitual de desarrollo en Odoo. Por ejemplo:


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='Domain expression to filter partner records' )

El atributo model_field enlaza el editor de dominio con el campo que contiene el nombre del modelo. Así el widget sabe qué campos ofrecer en el constructor visual. Separar el nombre del modelo en su propio campo también permite seleccionar el modelo dinámicamente si hace falta.


Mostrar el widget en una vista de formulario

Para que el constructor aparezca en el formulario, referencia ambos campos en el XML de la vista:


<field name="model_name" invisible="1"/> <field name="filter_domain" widget="domain" options="{'model': 'model_name'}"/>

Si no incluyes el widget="domain" y la opción de modelo, el campo se verá como texto plano. Inclúyelos siempre si expones configuración de dominios a usuarios.

Escribir dominios vía XML-RPC/JSON-RPC

Si actualizas valores de Domain por API, pásalos siempre como cadena:

Buenas prácticas


models.execute_kw(db, uid, api_key, 'my.model', 'write', [[record_id], { 'filter_domain': "[('active', '=', True)]" }] )


Enviar una lista Python en lugar de la cadena es un error común que produce fallos según la versión de Odoo. Serializa el dominio a string antes de enviarlo por la API.

Consejos prácticos para evitar problemas


Valida la sintaxis antes de desplegar

Un dominio inválido provoca errores al evaluarse. Prueba tus dominios en la barra de búsqueda o en modo desarrollador antes de guardarlos en acciones automáticas o reglas de registro. Una llamada de search_count vía API es una forma fiable de comprobar que el dominio devuelve el número esperado de registros.


Usa variables dinámicas cuando puedas

Evita codificar IDs de usuario, compañías o fechas. Emplea variables dinámicas como uid, context_today() o current_company_id. Así tus dominios serán portables y no se romperán al migrar o copiar configuraciones entre bases de datos.


Siempre liga el contexto del modelo

Al añadir un campo Domain a un modelo personalizado, define model_field y añade ese campo en la vista. Si no, los usuarios verán un cuadro de texto plano en lugar del constructor visual y será más probable que se guarden valores inválidos.


Mantén los dominios legibles

Los dominios anidados con | (OR) y & (AND) pueden volverse confusos. Añade comentarios en el código explicando la intención. Si un dominio se complica demasiado, valora usar una acción de servidor o un campo computado para una lógica más clara y testeable.


Usa safe_eval para evaluaciones programáticas

Cuando evalúes dominios desde Python (por ejemplo en acciones de servidor), emplea safe_eval en lugar de eval. Es más seguro, maneja variables de contexto de Odoo y se alinea con cómo Odoo interpreta los dominios internamente.

Errores habituales


Prueba con datos realistas


Verifica siempre que el dominio selecciona los registros esperados antes de ponerlo en producción. Esto es crítico para acciones automatizadas y reglas de acceso: un filtro erróneo puede procesar registros equivocados o bloquear accesos sin aviso.

Errores frecuentes y cómo esquivarlos


Confundir el tipo de campo con la sintaxis del domain

En Odoo "domain" tiene dos sentidos: la sintaxis del filtro y el tipo de campo fields.Domain. Muchos principiantes confunden ambos. El campo Domain es el contenedor; la expresión domain es la lógica de filtrado que va dentro.


Pasar una lista en vez de cadena por la API

Al escribir en un campo Domain vía XML-RPC/JSON-RPC debes enviar una cadena. Enviar una lista Python cruda provoca errores o fallos silenciosos según la versión. Serializa siempre el dominio antes de enviarlo por la API.


Olvidar el contexto de modelo en el widget

Si el campo Domain no tiene la opción de modelo en la vista, el editor visual no aparece y se muestra un texto plano. El constructor solo funciona cuando sabe qué modelo referenciar; incluye la opción model_field en la vista.


Hardcodear IDs de registros

Dominios que referencian IDs concretos fallan cuando esos registros se borran o al copiar la configuración a otra base de datos. Usa referencias dinámicas como uid o búsquedas relacionales para mantener la portabilidad.


Reglas de registro demasiado permisivas o restrictivas

Un dominio en una regla de registro que sea demasiado amplio puede exponer datos a quien no debe; si es demasiado estricto, ocultará registros sin avisar. Prueba siempre las reglas desde la cuenta del usuario objetivo, no desde un administrador que elude las reglas.

Conclusión


Olvidar los registros archivados


Por defecto Odoo excluye los registros archivados (active = False). Si no lo tienes en cuenta, tendrás huecos inesperados. Añade ('active', 'in', [True, False]) cuando necesites incluir archivados.


Resumen y valor


Los campos Domain son uno de esos elementos discretos que sostienen gran parte del funcionamiento de Odoo. Desde control de acceso y acciones automáticas hasta menús dinámicos y filtros de panel, las expresiones domain son la columna vertebral del filtrado de registros, y fields.Domain ofrece una forma validada y visible de guardar esa lógica en el modelo de datos.

Para usuarios, el editor de dominios facilita configurar filtros sin código. Para desarrolladores, el tipo Domain aporta claridad frente a guardar la lógica en Char con overrides de widget. Tanto si usas Odoo Studio, desarrollas módulos en Python o configuras flujos desde la interfaz, dominar los domain te abre muchas posibilidades.

Los conceptos explicados aquí aplican a múltiples versiones y módulos de Odoo. Invertir tiempo en entender los campos Domain es provechoso: están literalmente por todas partes en Odoo. ¿Necesitas ayuda con tu implementación de Odoo?En Dasolo acompañamos a empresas en la implantación, personalización y optimización de Odoo según sus procesos. Si necesitas montar automatizaciones, desarrollar módulos a medida o sacar más partido de tu instalación, contamos con experiencia técnica para avanzar con seguridad.

Campos Domain en Odoo: Guía Completa y Práctica
Dasolo 6 de marzo de 2026
Compartir esta publicación
Iniciar sesión para dejar un comentario