Introduction
Si has pasado tiempo trabajando dentro del modelo de datos de Odoo, probablemente te hayas encontrado con situaciones en las que necesitas mostrar un valor de un registro vinculado directamente en un formulario, sin pedir al usuario que haga clic en otro modelo. El campo Relacionado es cómo Odoo resuelve esto de manera limpia y declarativa.
En lugar de escribir un campo computado con un método de Python, un campo Relacionado simplemente lee a través de una cadena relacional existente y expone el valor al final de ella. Es una de las herramientas más útiles en la guía del desarrollador de Odoo, y también es accesible para consultores de negocios que trabajan con Odoo Studio y necesitan mostrar información contextual sin escribir código.
Esta guía explica qué almacena el campo Relacionado, cómo funciona en el marco de Odoo, cómo crearlo y configurarlo a través de Studio o Python, y dónde encaja en los flujos de trabajo empresariales reales.
What is the Related Field in Odoo
En el ORM de Odoo, un campo Relacionado no es un tipo de campo distinto de la misma manera que lo son Float o Char. En cambio, es un acceso directo que expone un campo de otro modelo siguiendo una cadena de campos relacionales. El campo Relacionado toma el tipo de cualquier campo al que apunta al final de la cadena.
El ejemplo más simple: una orden de venta tiene un campo partner_id (un Many2one que apunta a res.partner). Un campo Relacionado definido como related='partner_id.country_id' expondría el país del cliente directamente en la orden de venta, sin almacenar una copia separada de él.
Desde la perspectiva del usuario, un campo Relacionado se ve exactamente como cualquier otro campo en la vista de formulario. Si el campo terminal en la cadena es un Char, el campo Relacionado se renderiza como un campo de texto. Si es un Many2one, se renderiza como un menú desplegable. Si es un Boolean, muestra una casilla de verificación. El campo Relacionado hereda la presentación visual del campo que refleja.
Por defecto, los campos Relacionados son solo de lectura y no se almacenan en la base de datos. Esto significa que siempre muestran el valor actual del registro fuente, pero no puedes filtrar o buscar registros usando directamente en un dominio a menos que configures store=True.
En Odoo Studio, el campo Relacionado está disponible al agregar un nuevo campo a un formulario. Seleccionas una ruta relacional existente, y Studio crea el campo con la configuración apropiada. Esto lo convierte en uno de los campos más prácticos de Odoo Studio para consultores que necesitan enriquecer formularios sin escribir ningún Python.
How the Field Works
Cuando Odoo lee un campo Relacionado, sigue la cadena de nombres de campo separados por puntos. Cada paso en la cadena (excepto el último) debe ser un campo relacional: un Many2one, One2many o Many2many. El último campo en la cadena puede ser de cualquier tipo.
Aquí hay un ejemplo sencillo de un campo Relacionado definido en un módulo de Python:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
partner_country_id = fields.Many2one(
related='partner_id.country_id',
string='Customer Country',
store=True,
)
En este ejemplo, Odoo sigue partner_id para llegar al registro res.partner, luego lee country_id de él. El resultado es un campo Many2one en la orden de venta que refleja el país del cliente.
Campos Relacionados Almacenados vs. No Almacenados
Esta es la distinción más importante a entender. Por defecto, un campo Relacionado tiene store=False, lo que significa que se calcula sobre la marcha cada vez que se lee el registro. El valor no vive en la tabla de la base de datos para el modelo.
Con store=True, Odoo escribe el valor en la columna de la base de datos cuando el registro fuente cambia. Esto permite filtrar, agrupar y buscar en el campo Relacionado, lo que lo hace mucho más útil para informes y vistas de lista.
La compensación es que los campos Relacionados almacenados consumen espacio en la base de datos y requieren un desencadenador de actualización cada vez que cambia la fuente. Odoo maneja esto automáticamente a través de su sistema de seguimiento de dependencias, pero vale la pena tenerlo en cuenta para modelos sensibles al rendimiento con muchos registros.
Campos Relacionados de Solo Lectura vs. Editables
Por defecto, los campos Relacionados son de solo lectura. Agregar readonly=False hace que el campo sea editable. Cuando un usuario cambia el valor, Odoo lo escribe de nuevo a través de la cadena al registro fuente. Este es un comportamiento poderoso pero potencialmente sorprendente: editar el campo Relacionado en un pedido de venta modifica en realidad el registro del socio, no el pedido en sí.
Utiliza campos Relacionados editables solo cuando realmente pretendas este comportamiento de escritura a través. Puede ser muy útil en algunos contextos, como un campo de edición rápida en una vista de lista, pero también puede llevar a cambios de datos no intencionados si los usuarios no entienden lo que están editando.
Atributos Clave del Campo
Estos son los principales parámetros que configuras en un campo Relacionado:
- related: La cadena de nombres de campo separados por puntos (por ejemplo,
'partner_id.country_id'). Este es el único atributo requerido. - store: Establecer en
Truepara persistir el valor en la base de datos. Permite filtrar y agrupar. - readonly: Establecer en
Falsepara permitir que los usuarios editen el campo, lo que escribe a través de la fuente. - string: La etiqueta mostrada a los usuarios. Por defecto, es la etiqueta del campo terminal.
- depends: Normalmente no es necesario ya que Odoo infiere las dependencias de la cadena
relatedautomáticamente. Solo es necesario en casos extremos.
Cómo Interactúa con el ORM de Odoo
Leer un campo Relacionado devuelve el valor del campo terminal en el registro vinculado. Si algún enlace en la cadena está vacío (por ejemplo, partner_id no está establecido), el campo Relacionado devuelve False. Este es el comportamiento estándar del ORM de Odoo y se aplica a todos los campos relacionales en el modelo de datos de Odoo.
Los campos relacionados están completamente soportados en dominios, vistas e informes cuando están almacenados. Los campos relacionados no almacenados pueden mostrarse en vistas de formulario y lista, pero no pueden utilizarse como criterios de filtro en un dominio de búsqueda a menos que el servidor los evalúe en Python en lugar de SQL.
Casos de Uso Empresarial
Los campos relacionados aparecen en casi todas las partes de una implementación de Odoo. Aquí hay cinco ejemplos prácticos de flujos de trabajo empresariales reales.
CRM y Ventas: Teléfono del Cliente en Pedidos de Venta
Una solicitud común de los equipos de ventas es ver el número de teléfono del cliente directamente en el formulario del pedido de venta, sin tener que abrir el registro del cliente por separado. Un campo relacionado definido como related='partner_id.phone' en sale.order resuelve esto de inmediato. Muestra el número de teléfono en contexto, acelera las llamadas de ventas y no requiere ningún esfuerzo adicional de desarrollo. En Odoo Studio, un consultor puede añadir esto en menos de un minuto utilizando la opción de campo relacionado.
Contabilidad: Moneda de la Empresa en Líneas de Factura
En configuraciones de Odoo multiempresa, los contadores a veces necesitan mostrar la moneda de la empresa directamente en las líneas de factura para mayor claridad en los informes. Un campo relacionado como related='move_id.company_id.currency_id' se encadena a través de dos campos Many2one para llegar a la moneda. Esta cadena de tres niveles es válida, aunque generalmente se recomienda mantener las cadenas cortas por razones de rendimiento. Almacenar este campo permite filtrar facturas por moneda de la empresa en informes analíticos.
Inventario: Categoría de Producto en Líneas de Movimiento de Stock
Los equipos de almacén que gestionan movimientos de stock a menudo necesitan ver la categoría del producto sin abrir cada registro de producto. Un campo relacionado en stock.move.line que apunta a product_id.categ_id expone la categoría directamente en la línea de movimiento. Con store=True, esto permite agrupar el stock entrante y saliente por categoría de producto en las vistas de informes de Inventario, lo que es particularmente útil para empresas que gestionan una amplia gama de familias de productos.
Manufactura: Referencia Interna en Componentes de Orden de Trabajo
Los gerentes de producción en empresas manufactureras frecuentemente necesitan ver la referencia interna del producto en las líneas de componentes de la orden de trabajo durante la producción. Un campo relacionado que lee product_id.default_code en las líneas de mrp.workorder coloca el número de referencia exactamente donde lo necesita el operador, reduciendo errores causados por la selección de productos similares. Este tipo de pequeña personalización tiene un impacto real en la precisión del piso de producción.
Hojas de Tiempo y Proyectos: Departamento del Empleado
Cuando los gerentes de proyecto revisan las líneas de hojas de tiempo, a veces necesitan ver a qué departamento pertenece el empleado para fines de asignación de costos. Un campo relacionado definido como related='employee_id.department_id' en account.analytic.line (el modelo de hoja de tiempo) muestra el departamento directamente en la entrada de la hoja de tiempo. Almacenado con store=True, permite filtrar hojas de tiempo por departamento en informes de análisis de proyectos, haciendo de Odoo una herramienta más completa para la gestión de proyectos y la asignación de recursos.
Creación o Personalización del Campo Relacionado
Hay tres formas principales de agregar un campo Relacionado a un modelo de Odoo, dependiendo de tu contexto técnico y de cómo se gestiona el despliegue.
Usando Odoo Studio (Sin Código)
Odoo Studio te permite agregar campos Relacionados sin escribir ningún Python. Así es como se hace:
- Abre Odoo Studio desde el menú principal.
- Navega hasta el formulario donde deseas agregar el campo.
- Haz clic en Agregar un campo y elige Campo Relacionado.
- Selecciona la ruta relacional haciendo clic a través de los campos disponibles paso a paso.
- Dale un nombre al campo y configura si debe ser almacenado o de solo lectura.
- Guarda y cierra Studio.
Studio crea automáticamente el campo con un prefijo x_studio_ y lo coloca en la vista. Esta es una de las formas más eficientes de usar los campos de Odoo Studio para agregar información contextual a formularios existentes. No se necesitan cambios en la base de datos de tu parte.
Usando Python en un Módulo Personalizado
Para los desarrolladores que trabajan en la personalización de Odoo a través de código, los campos Relacionados se definen en la clase del modelo. Este es el enfoque recomendado por la guía del desarrollador de Odoo para cualquier cambio que necesite control de versiones y despliegue en múltiples entornos:
from odoo import fields, models
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
product_category_id = fields.Many2one(
related='product_id.categ_id',
string='Categoría del Producto',
store=True,
)
Después de definir el campo, añádalo a la vista XML relevante para que aparezca en la interfaz. Odoo maneja la creación de la columna de la base de datos automáticamente durante la instalación o actualización del módulo. Este es el enfoque estándar de desarrollo de Odoo para una personalización de Odoo fiable y mantenible.
Uso de la API XML-RPC
Para implementaciones gestionadas programáticamente, por ejemplo, a través de un cuaderno de configuración remoto, los campos relacionados se pueden crear a través de la API XML-RPC estableciendo el atributo related en la definición del campo:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_partner_country_id',
'field_description': 'País del Cliente',
'model_id': sale_order_model_id,
'ttype': 'many2one',
'relation': 'res.country',
'related': 'partner_id.country_id',
'store': True,
'readonly': True,
'state': 'manual',
}]
)
Al crear un campo relacionado a través de la API, necesitas especificar el ttype y relation correctos manualmente, ya que la API no infiere automáticamente el tipo de la cadena como lo hace el ORM de Python. Este es el enfoque que utiliza Dasolo para implementar personalizaciones de campos de Odoo de forma remota a través de scripts de configuración automatizados.
Mejores Prácticas
1. Almacenar el campo cuando se necesita filtrar o agrupar
Si los usuarios necesitan filtrar una vista de lista por el campo relacionado, o agrupar registros por él en una tabla dinámica, añada store=True. Sin ello, no es posible el filtrado a nivel de base de datos, y Odoo tendría que cargar todos los registros en Python para aplicar el filtro, lo que no escala. Para campos de solo visualización en vistas de formulario, no almacenados está perfectamente bien.
2. Mantener la cadena lo más corta posible
Una cadena de dos niveles como partner_id.country_id es limpia y eficiente. Una cadena de cuatro niveles como picking_id.sale_id.partner_id.country_id introduce más puntos de fallo potenciales y es más difícil de mantener. Si te encuentras construyendo cadenas muy profundas, considera si un campo computado con lógica explícita en Python sería más claro y más fácil de depurar.
3. Entender lo que realmente significa readonly=False
Un campo relacionado escribible no crea una copia local de los datos. Modifica el registro fuente. Si haces que partner_id.phone sea editable en un pedido de venta, cambiarlo actualiza el registro del socio en res.partner. Ese cambio afecta a cada otro documento vinculado a ese socio. Asegúrate de que esto sea intencional y siempre informa a los usuarios cuando un campo edita un registro compartido.
4. Utiliza campos relacionados para mostrar, no para duplicar datos
Los campos relacionados están destinados a mostrar datos existentes en contexto, no a duplicarlos. Si te encuentras queriendo tener una copia independiente de un valor que puede divergir de la fuente, un campo regular con un valor predeterminado establecido por una acción onchange o automatizada es el enfoque correcto, no un campo relacionado con store=True y readonly=False.
5. Verifica las implicaciones de los derechos de acceso
Un campo relacionado lee a través de otro modelo. Si el usuario actual no tiene acceso de lectura a ese modelo, el campo puede devolver un valor vacío en silencio. Este es el comportamiento de seguridad correcto de Odoo, pero puede confundir a los usuarios que ven un campo en blanco sin entender por qué. Al diseñar formularios con campos relacionados, verifica que los roles de usuario esperados tengan acceso de lectura a todos los modelos en la cadena.
Errores Comunes
Filtrando en un campo relacionado no almacenado
Este es el error más común. Un desarrollador o consultor añade un campo relacionado a una vista de lista y luego intenta agregar un filtro de búsqueda sobre él. Si store=False (el valor predeterminado), Odoo no puede filtrar por este campo a nivel de base de datos. El dominio generará un error o devolverá silenciosamente ningún resultado. Siempre añade store=True a cualquier campo relacionado que planees usar en filtros de búsqueda o cláusulas de agrupación.
Comportamiento inesperado de escritura a través
Establecer readonly=False en un campo relacionado y luego sorprenderse de que las ediciones afecten el registro fuente es un problema muy común, especialmente cuando los campos relacionados se añaden a través de Odoo Studio por usuarios no familiarizados con la mecánica. Antes de hacer un campo relacionado editable, siempre confirma con las partes interesadas del negocio si desean que las ediciones se propaguen de vuelta al modelo fuente.
No manejar campos intermedios vacíos
Si algún campo en la cadena está vacío, el campo relacionado devuelve False. En una vista de formulario, esto generalmente significa que el campo se muestra en blanco. En un campo computado o un método de Python que lee el valor del campo relacionado, necesitas manejar el caso False para evitar TypeErrors. Esto es fácil de pasar por alto en las pruebas cuando todos los registros tienen datos completos, pero se presenta en producción cuando se dejan vacíos campos opcionales.
Usar Relacionado donde un campo Computado es más apropiado
Los campos relacionados funcionan bien cuando estás reflejando un solo campo a través de una cadena relacional. Cuando necesitas aplicar alguna lógica, transformación o comportamiento condicional sobre el valor, un campo computado con un método de Python es la elección correcta. Intentar hacer lógica condicional a través de una cadena de campos relacionados conduce a soluciones alternativas que son difíciles de mantener y fáciles de romper en futuras actualizaciones de Odoo. Este es un punto común en cualquier tutorial técnico de Odoo sobre tipos de campos.
Problemas de rendimiento con muchos campos Relacionados almacenados en modelos grandes
Cada campo Relacionado almacenado requiere una actualización cuando cambia el valor de origen. Si agregas diez campos Relacionados almacenados en un modelo con cientos de miles de registros, y los campos de origen se actualizan con frecuencia, puedes crear una carga de escritura significativa en la base de datos. Para el desarrollo a gran escala de Odoo, perfila el impacto en el rendimiento de los campos Relacionados almacenados y prefiere campos de solo visualización no almacenados donde la precisión en tiempo real no sea crítica.
Conclusión
El campo Relacionado es una de las herramientas más prácticas disponibles en el marco de Odoo para mostrar información contextual sin duplicar datos. Te permite leer a través de cadenas relacionales, mostrar valores de registros vinculados directamente en cualquier vista y, opcionalmente, almacenar esos valores para filtrado e informes.
Entender cuándo usar store=True, cuándo es apropiado readonly=False y cómo manejar campos intermedios vacíos te ahorrará tiempo y evitará los problemas de datos más comunes en las implementaciones de Odoo. Ya seas un desarrollador escribiendo módulos de Python, un consultor utilizando Odoo Studio, o un líder técnico gestionando configuraciones remotas, vale la pena conocer bien el campo Relacionado.
Si estás construyendo o extendiendo un modelo de datos de Odoo, los campos Relacionados pertenecen a tu conjunto de herramientas junto a los campos Computados, campos Many2one y otros tipos de campos de Odoo cubiertos en esta serie.
En Dasolo, ayudamos a las empresas a implementar, personalizar y optimizar Odoo en Ventas, Operaciones, Contabilidad y más. Si necesitas ayuda para diseñar tu modelo de datos de Odoo, agregar campos personalizados a tus flujos de trabajo o extender tu configuración de Odoo con código confiable y mantenible, estamos aquí para ayudar. Contáctanos y hablemos sobre cómo podemos apoyar tu proyecto de Odoo.