Ir al contenido

Campos Heredados en Odoo: Cómo el ORM Comparte Datos Entre Modelos

Una guía práctica para entender la herencia de campos en Odoo y cómo utilizarla en tus personalizaciones
6 de marzo de 2026 por
Campos Heredados en Odoo: Cómo el ORM Comparte Datos Entre Modelos
Dasolo
| Sin comentarios aún

Introducción


Cuando comienza a trabajar con el desarrollo de Odoo, un concepto surge una y otra vez: la herencia. El ORM de Odoo está construido en torno a la idea de que los modelos pueden extender, compartir y reutilizar los campos de otros sin duplicar datos ni escribir código redundante.


Los campos heredados son centrales en este sistema. Son la forma en que Odoo permite que un modelo acceda y exponga de manera transparente campos que están físicamente definidos y almacenados en otro modelo. Una vez que comprenda este mecanismo, muchas cosas en el modelo de datos de Odoo comenzarán a tener sentido.


Esta guía explica qué son los campos heredados, los tres tipos de herencia de modelos que los producen, cómo se comportan en la base de datos y cómo puede utilizarlos en proyectos de personalización de Odoo en la vida real.

¿Qué es un campo heredado en Odoo?


En el marco ORM de Odoo, un campo se considera heredado cuando un modelo obtiene acceso a campos definidos en otro modelo a través de uno de los tres mecanismos de herencia soportados. En lugar de redefinir esos campos desde cero, el modelo hijo simplemente los reutiliza.


Esto es parte de lo que hace que el modelo de datos de Odoo sea tan compacto y consistente. El mismo campo name en un registro de socio es el que aparece en los pedidos de venta, oportunidades de CRM y facturas, porque todos estos modelos eventualmente leen de la misma fuente.


Los Tres Tipos de Herencia en Odoo

Odoo soporta tres tipos distintos de herencia de modelos, y cada uno maneja los campos de manera diferente.

1. Herencia Clásica

Este es el patrón más común en el desarrollo de Odoo. Usas _inherit sin definir un nuevo _name. Esto extiende un modelo existente directamente, añadiendo nuevos campos o métodos a él. No se crea una nueva tabla de base de datos. Los nuevos campos simplemente aparecen en el modelo original.


Así es como la mayoría de los módulos de Odoo añaden campos a modelos estándar. Si instalas el módulo de CRM, añade campos a res.partner a través de la herencia clásica. Esos campos se almacenan en la tabla de socios junto a los campos principales.


2. Herencia de Prototipo

Esto es cuando combinas _inherit y _name juntos. El nuevo modelo comienza como una copia de la estructura del modelo padre, pero obtiene su propia tabla de base de datos. Todos los campos del padre se duplican en el nuevo modelo. Los cambios en el modelo hijo no afectan al padre.


Este patrón es menos común en la personalización diaria, pero se utiliza para crear modelos completamente nuevos que comparten la estructura de uno existente.


3. Herencia por Delegación

Este es el tipo más distintivo, definido usando _inherits. El modelo hijo se vincula a un modelo padre a través de un campo Many2one. El modelo hijo luego expone de manera transparente todos los campos del padre como si fueran propios. Los datos residen en la tabla del padre, no en la tabla del hijo.

Esto es lo que la mayoría de los desarrolladores quiere decir cuando hablan de campos heredados en el sentido estricto. Los campos no están duplicados. Se accede a ellos a través del enlace relacional en el momento de lectura y escritura.


El ejemplo más famoso en Odoo estándar es la relación entre res.users y res.partner. Cada usuario también es un socio. El nombre, correo electrónico y número de teléfono del usuario se almacenan en el registro del socio y son accesibles por el usuario a través de la herencia por delegación.

Cómo funciona el campo


Herencia por Delegación Bajo el Capó

Cuando un modelo utiliza _inherits, el ORM de Odoo crea un puente transparente entre dos tablas de base de datos. Cuando lees un campo heredado en el registro hijo, Odoo sigue automáticamente el enlace Many2one al registro padre y devuelve el valor almacenado allí.


Cuando escribes en un campo heredado desde el modelo hijo, Odoo escribe directamente en el registro padre. Desde la perspectiva del desarrollador, el campo se siente nativo. Desde la perspectiva de la base de datos, los datos residen en la tabla padre.


Esto tiene una consecuencia importante: no hay duplicación de datos. Si actualizas el nombre de un socio, ese cambio se refleja inmediatamente en todas partes donde se referencia al socio, incluido el registro del usuario que hereda de él.


Herencia Clásica y la Base de Datos

Con la herencia clásica, se añaden nuevos campos a la tabla de base de datos del modelo original. No hay una segunda tabla involucrada. El modelo extendido y el modelo original son lo mismo en la base de datos. Esta es la forma más limpia y común de añadir campos en proyectos de personalización de Odoo.


Campos Relacionados como Herencia Ligera

Un campo related es un tipo especial de campo computado en el ORM de Odoo que lee un valor de un registro vinculado a través de una cadena de campos relacionales. No es estrictamente lo mismo que la herencia de modelos, pero a menudo se utiliza para mostrar datos de estilo heredado en un modelo sin modificar la estructura del modelo.


Por ejemplo, podrías definir un campo partner_country_id en un pedido de venta que lee partner_id.country_id. El campo se comporta como un campo nativo en el pedido de venta, pero el valor proviene del socio.

Los campos relacionados pueden opcionalmente almacenarse en la base de datos con store=True, lo que mejora el rendimiento de búsqueda y filtrado, pero añade sobrecarga de almacenamiento y requiere recomputación cuando la fuente cambia.


Cómo se resuelven los campos en tiempo de ejecución

Cuando Odoo carga una definición de modelo, resuelve el mapa completo de campos, incluidos todos los campos heredados. Para cuando un modelo está listo para su uso, Odoo ya ha mapeado cada campo accesible a su fuente, ya sea que esa fuente sea la propia tabla del modelo, una tabla padre a través de delegación, o una cadena relacionada. Esta resolución ocurre una vez al inicio del servidor y se almacena en caché para mejorar el rendimiento.

Casos de uso empresarial


Los campos heredados no son solo un concepto técnico. Resuelven problemas comerciales reales al mantener los datos consistentes en diferentes partes de Odoo sin duplicación.


1. CRM y Ventas: Información de Contacto

Cuando un vendedor crea un lead en el módulo CRM, el nombre del cliente, el número de teléfono y la dirección de correo electrónico provienen del registro del socio a través de un enlace Many2one. Si los detalles del socio cambian, cada lead, cotización y pedido vinculado a ese socio refleja la actualización de inmediato.


Esta es la herencia clásica y los campos relacionados trabajando juntos. El módulo CRM extiende res.partner con campos específicos de CRM (como el conteo de leads y la etapa de oportunidad), y los pedidos de venta muestran la información de contacto del socio a través de campos relacionados.


2. Productos y Variantes

El modelo de producto de Odoo utiliza la herencia por delegación para manejar las variantes de productos de manera limpia. El modelo product.product (una variante específica) utiliza _inherits para vincularse a product.template. Los campos compartidos entre todas las variantes, como el nombre del producto, la categoría, el precio de venta y la descripción, residen en la plantilla. Los campos específicos de la variante, como el código de barras o la referencia interna, residen en el registro de la variante misma.


Este diseño significa que puedes tener 50 variantes de color de una camisa, todas compartiendo el mismo nombre y descripción, sin almacenar esos valores 50 veces en la base de datos.


3. Usuarios y Socios

Cada usuario de Odoo también es un contacto. El modelo res.users utiliza _inherits = {'res.partner': 'partner_id'}, lo que significa que el usuario hereda automáticamente todos los campos del socio, incluidos nombre, correo electrónico, teléfono, dirección y foto de perfil. Cuando actualizas la dirección de correo electrónico de un empleado, se actualiza tanto en la configuración del usuario como en la libreta de contactos al mismo tiempo.


4. Inventario: Movimientos de Stock e Información del Producto

Las líneas de movimiento de stock en el módulo de Inventario muestran descripciones de productos que provienen de la plantilla del producto a través de una cadena de campos relacionados. Los gerentes de almacén ven información precisa y actualizada del producto directamente en sus listas de picking sin que el módulo de inventario necesite duplicar los datos del producto.


5. Contabilidad: Líneas de Factura

Las líneas de movimiento contable hacen referencia a productos y socios. El nombre del producto, los códigos de cuenta y las configuraciones fiscales que se muestran en una línea de factura se obtienen de los modelos de producto y socio a través de enlaces relacionales y campos relacionados. Los contadores ven datos consistentes que coinciden con lo que los equipos de ventas configuraron en el producto, porque están leyendo de la misma fuente.

Creación o personalización de campos heredados


Usando Odoo Studio

Odoo Studio es la interfaz sin código para personalizar modelos y vistas de Odoo. Desde Studio, puedes agregar nuevos campos a cualquier modelo sin escribir código Python. Lo que Studio hace bajo el capó es herencia clásica: extiende el modelo al agregar un nuevo campo a su definición.


Studio también te permite crear campos relacionados. Cuando eliges "Campo Relacionado" como tipo de campo, puedes apuntar a cualquier campo accesible a través de una cadena relacional desde el modelo actual. Por ejemplo, en el modelo de pedido de venta, puedes crear un campo relacionado que lea el país o el número de IVA del cliente directamente del registro del socio.


Para la mayoría de los usuarios empresariales y consultores funcionales, Studio es la herramienta adecuada para agregar campos a Odoo. Maneja automáticamente la nomenclatura de campos, la migración de bases de datos y la colocación de vistas.


Personalización Técnica con Python

Para los desarrolladores que construyen módulos de Odoo, los campos heredados se definen en Python utilizando la clase models.Model del ORM de Odoo.


Herencia clásica para agregar un campo personalizado a un modelo existente:

class CrmLead(models.Model):
    _inherit = 'crm.lead'

    x_contract_value = fields.Float(
        string='Valor Estimado del Contrato'
    )

Herencia por delegación para crear un nuevo modelo que comparta campos de uno existente:

class EmployeeProfile(models.Model):
    _name = 'hr.employee.profile'
    _inherits = {'res.partner': 'partner_id'}

    partner_id = fields.Many2one(
        'res.partner',
        required=True,
        ondelete='cascade'
    )
    employee_id = fields.Many2one(
        'hr.employee',
        string='Empleado'
    )

Campos relacionados para mostrar un valor de un registro vinculado:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    partner_country_id = fields.Many2one(
        related='partner_id.country_id',
        string='País del Cliente',
        store=True
    )

A través de la API XML-RPC (Configuración Remota)

Los campos también se pueden agregar programáticamente utilizando la API XML-RPC de Odoo y el modelo ir.model.fields. Este es el enfoque utilizado en los cuadernos de configuración remota de Dasolo. Es equivalente a lo que hace Studio y permite la creación de campos sin acceso directo al servidor.


Para agregar un campo relacionado a través de la API, se crea un registro ir.model.fields con ttype='many2one' (o el tipo apropiado) y se establece el parámetro related para definir la ruta relacional. Este enfoque es adecuado para implementar campos personalizados como parte de un proceso de configuración automatizado.

Mejores prácticas


Elige el Tipo de Herencia Correcto para el Trabajo

Utiliza la herencia clásica cuando simplemente quieras agregar campos o métodos a un modelo existente. Es el enfoque más simple y es lo que utiliza la gran mayoría de los módulos de Odoo. Reserva la herencia por delegación para los casos en que realmente necesites dos conjuntos de registros separados vinculados entre sí, como cuando un concepto de negocio extiende un contacto sin ser un contacto en sí.


Prefiere Campos Relacionados para Acceso de Lectura

Si solo necesitas mostrar un valor de un registro vinculado en un formulario o vista de lista, un campo relacionado es más limpio que la herencia por delegación. Evita crear una nueva dependencia estructural y es fácil de entender y mantener.


Ten Cuidado con store=True en Campos Relacionados

Almacenar un campo relacionado en la base de datos acelera las búsquedas y filtros, pero significa que el valor es una copia. Odoo activa la recomputación cuando la fuente cambia, pero en casos extremos esto puede quedar desincronizado. Solo almacena campos relacionados cuando realmente necesites filtrar o clasificar por ellos a gran escala.


Siempre prefija los campos personalizados con x_

Cualquier campo que añadas a un modelo estándar de Odoo a través de la herencia debe comenzar con x_ (o usar un espacio de nombres de módulo en un módulo adecuado). Esto previene conflictos con los campos añadidos por Odoo en versiones futuras.


Documenta tu cadena de herencia

Al trabajar en personalizaciones complejas, escribe un breve comentario o nota de diseño explicando de dónde provienen los campos y por qué. Un campo llamado x_country_code en un pedido de venta puede no vincularse de manera obvia a partner_id.country_id.code sin documentación.


Maneja correctamente las eliminaciones en cascada

En la herencia por delegación, el registro padre se crea automáticamente cuando se crea el hijo. Cuando se elimina el hijo, el padre también debería eliminarse normalmente. Establece ondelete='cascade' en el Many2one en _inherits para asegurar una eliminación limpia sin registros huérfanos.


Errores comunes


Confundir los tres tipos de herencia

El error más común para los desarrolladores nuevos en Odoo es usar _inherit con _name cuando pretendían una extensión clásica. Esto crea accidentalmente un modelo completamente nuevo en lugar de extender el existente. Verifica tu definición de modelo: si no pretendes crear un nuevo modelo, omite _name.


Olvidar crear el registro padre en _inherits

Con la herencia por delegación, el registro padre no se crea automáticamente en todos los escenarios. Al crear un registro hijo programáticamente a través de la API o en un script, necesitas dejar que el ORM de Odoo maneje la creación del padre (lo cual hace cuando usas create normalmente) o crear primero el registro padre y pasar su ID. Saltarse este paso resulta en un error de restricción de base de datos.


Intentar cambiar el tipo de un campo a través de la herencia

Odoo no permite sobrescribir el tipo de un campo existente a través de la herencia. Puedes cambiar atributos como la etiqueta de cadena, el dominio o el texto de ayuda, pero no puedes cambiar un campo Char a un campo Integer. Intentar esto causará un error de instalación del módulo.


Uso excesivo de campos relacionados almacenados

Agregar store=True a cada campo relacionado es tentador por razones de rendimiento, pero aumenta el tamaño de la base de datos e introduce una sobrecarga de mantenimiento. Si el campo fuente cambia con frecuencia, los campos relacionados almacenados provocan mucha recomputación. Utiliza campos relacionados almacenados de manera selectiva, solo cuando tengas una necesidad concreta de filtrar o agrupar por ellos en grandes conjuntos de datos.


Asumir que los campos heredados respetan las reglas de acceso del modelo hijo

Los campos heredados a través de la delegación residen en el modelo padre. Los derechos de acceso definidos en el modelo hijo no se aplican automáticamente a esos campos a nivel de base de datos. Si restringes el acceso al modelo hijo pero no al padre, los usuarios aún pueden leer los valores de los campos heredados a través del modelo padre directamente. Siempre revisa las reglas de seguridad para ambos modelos al utilizar la herencia por delegación.

Conclusión


Los campos heredados no son una característica de nicho del desarrollo de Odoo. Están integrados en la arquitectura del sistema. La relación entre usuarios y socios, entre variantes de productos y plantillas, entre órdenes de venta e información de contacto del cliente: todas estas dependen de la herencia de campos para mantener los datos consistentes y evitar duplicaciones.


Entender qué tipo de herencia usar, cuándo usar un campo relacionado en su lugar y cómo se comportan estos mecanismos en la base de datos te hará un personalizador de Odoo significativamente más efectivo. Escribirás código más limpio, diseñarás mejores modelos de datos y pasarás menos tiempo depurando comportamientos inesperados de los campos.


La conclusión clave es simple: el ORM de Odoo está diseñado para que los campos vivan en un lugar y sean accesibles desde muchos. Este es el principio detrás de los campos heredados, y es lo que mantiene coherente el modelo de datos de Odoo incluso a medida que crece a través de docenas de módulos interconectados.

¿Necesita ayuda con su implementación de Odoo?


En Dasolo, ayudamos a las empresas a implementar, personalizar y optimizar Odoo. Ya sea que estés construyendo un módulo personalizado desde cero, extendiendo modelos estándar con nuevos campos, o tratando de entender por qué tu modelo de datos se comporta de maneras inesperadas, nuestro equipo tiene la experiencia práctica en Odoo para ayudarte a avanzar más rápido y evitar errores costosos.


Si tienes preguntas sobre tu modelo de datos de Odoo, estrategia de campos personalizados o implementación técnica, estaremos encantados de hablar sobre tu situación. Contáctanos y encontremos el enfoque adecuado para tu proyecto.

Campos Heredados en Odoo: Cómo el ORM Comparte Datos Entre Modelos
Dasolo 6 de marzo de 2026
Compartir esta publicación
Iniciar sesión para dejar un comentario