Ir al contenido

Campo One2many en Odoo: Guía Completa y Práctica

Explicación práctica del campo One2many en Odoo: cuándo conviene usarlo y cómo integrarlo en tu modelo de datos En Odoo, el campo One2many sirve para representar relaciones de uno a muchos entre modelos: un registro «padre» enlaza con varios registros «hijo». Piensa en una factura que agrupa varias líneas: la factura es el único lado «uno» y cada línea es un elemento del lado «muchos». Este tipo de campo no almacena datos por sí mismo en la tabla del padre; su propósito es facilitar la navegación y la gestión de conjuntos de registros relacionados desde el modelo padre. Cuándo elegir One2many Usa One2many cuando necesites agrupar colecciones de objetos que dependen claramente de un único registro principal y quieras poder ver y editar esas colecciones desde la vista del padre. Ejemplos típicos: facturas y líneas de factura, proyectos y tareas, clientes y direcciones. Si los hijos deben existir sin un padre o la relación es puramente relacional sin jerarquía, quizá convenga usar Many2many o Many2one según el caso. Cómo se implementa en el modelo Técnicamente, en Odoo defines una relación One2many en el modelo padre usando fields.One2many('módulo.modelo_hijo', 'campo_relacion', string='Etiqueta'). El segundo parámetro es el nombre del campo Many2one que debe existir en el modelo hijo y que apunta de vuelta al padre. Por ejemplo, en el modelo invoice declararías invoice_line_ids = fields.One2many('account.move.line', 'move_id', string='Líneas') y en account.move.line tendrías move_id = fields.Many2one('account.move', string='Factura'). Consideraciones de diseño y rendimiento Ten en cuenta que las operaciones sobre colecciones One2many pueden implicar muchas consultas si no se usan bien; Odoo carga las líneas bajo demanda o mediante joins según la vista y el ORM. Para listas muy largas, valora paginación, vistas tree limitadas o mecanismos de filtrado para evitar sobrecargar el cliente. Además, define ondelete apropiado en el Many2one (por ejemplo 'cascade') si quieres que borrar el padre elimine también los hijos. Buenas prácticas en vistas y acciones En las vistas XML, integra el One2many mediante <field name="invoice_line_ids"><tree>…</tree></field> o con <form> para editar en línea. Para operaciones masivas, añade botones o asistentes que trabajen en lote sobre los registros hijo a través del contexto y métodos del modelo. Aprovecha atributos como readonly, domain y context para controlar comportamiento y filtros desde la interfaz. Resumen rápido - One2many modela colecciones dependientes de un único padre. - Se declara en el padre y requiere un Many2one inverso en el hijo. - Ideal para relaciones jerárquicas (factura→líneas, pedido→items). - Vigila rendimiento con listas largas y aplica paginación/filtrado. - Controla borrado en cascada y comportamiento en las vistas XML. Con estas pautas podrás incorporar One2many en tus modelos Odoo de forma sólida y mantener la aplicación ágil y coherente.
6 de marzo de 2026 por
Campo One2many en Odoo: Guía Completa y Práctica
Dasolo
| Sin comentarios aún

Introducción


Si alguna vez has abierto un pedido de venta en Odoo y has visto el listado de líneas justo debajo de los datos del cliente, ya has interactuado con un One2many. Es una pieza clave del modelo de datos de Odoo: conecta un registro “padre” con una colección de registros “hijo” y permite trabajar con listas relacionadas sin salir del formulario principal.


Esta guía resume qué es un One2many, cómo lo gestiona el ORM de Odoo, cuándo conviene usarlo en tu solución y las formas prácticas de crearlo o configurarlo, tanto desde Odoo Studio como programando en Python.

Tanto si eres un usuario de negocio que quiere entender la estructura de su información como si eres desarrollador en busca de una referencia práctica, aquí encontrarás lo esencial para trabajar con One2many en Odoo.

¿Qué es el campo One2many en Odoo?


El One2many es un tipo de campo relacional en Odoo pensado para modelar situaciones donde un registro principal tiene varios registros asociados en otro modelo.


En términos sencillos: una factura puede tener varias líneas; un pedido de venta puede contener muchas líneas de pedido; un proyecto puede agrupar múltiples tareas. El registro padre actúa como contenedor de esos elementos relacionados mediante el One2many.


En la interfaz de Odoo, el One2many suele mostrarse como una tabla incrustada en el formulario del padre. Esa lista permite crear, editar o eliminar los registros hijos al instante, sin abrir pantallas adicionales, y es uno de los patrones más visibles y utilizados en el ERP.


Diferencias frente a otros campos relacionales

Odoo dispone de tres tipos relacionales principales en su ORM.


  • Many2one: un campo en un registro que apunta a un único registro de otro modelo (por ejemplo, un pedido que referencia a un cliente).
  • One2many: un campo en un registro que agrupa varios registros de otro modelo (por ejemplo, un pedido con varias líneas).
  • Many2many: una relación muchos-a-muchos donde registros de ambos modelos pueden enlazarse entre sí (por ejemplo, productos y etiquetas).

Usa One2many cuando cada elemento hijo pertenece solo a un padre. Si un mismo hijo debe relacionarse con varios padres al mismo tiempo, entonces la opción correcta es Many2many.


Una característica importante del One2many es que no almacena columnas propias en la tabla del padre: es un campo virtual que muestra registros del modelo hijo usando como ancla un Many2one en ese modelo hijo.

Cómo funciona el campo


A nivel de base de datos, el One2many no crea un campo físico en la tabla del padre. La información reside en la tabla del hijo, donde cada fila incorpora una clave foránea que apunta al registro padre.


En el diseño del ORM de Odoo esto es fundamental: cada One2many tiene siempre su Many2one inverso en el modelo relacionado. El One2many actúa como una consulta inversa: Odoo recupera todos los hijos cuyo campo Many2one coincide con el ID del padre.


La relación entre One2many y Many2one

Al definir un One2many en Python se necesitan dos parámetros clave:


  • comodel_name: el modelo que contiene los registros hijos.
  • inverse_name: el nombre del campo Many2one en el modelo hijo que referencia al padre.

Un ejemplo habitual en un módulo personalizado es vincular un contrato de servicio con sus entregables.


deliverable_ids = fields.One2many(
    comodel_name='service.deliverable',
    inverse_name='contract_id',
    string='Deliverables'
)

En este ejemplo, contract_id es un Many2one declarado en service.deliverable que apunta al contrato. Sin ese Many2one previamente definido, el One2many no puede funcionar.


Qué ocurre en la base de datos

En la tabla del padre no verás columnas añadidas por el One2many. La relación se materializa en la tabla del hijo donde cada registro incluye la clave que apunta al padre.

Cuando Odoo carga el padre y necesita mostrar su One2many, ejecuta una consulta para obtener todas las filas del hijo cuyo campo foráneo coincide con el ID del padre. El ORM automatiza esa operación de búsqueda.


Por eso se considera un campo calculado desde el punto de vista de la estructura física: es una vista relacional de registros asociados, no un dato almacenado en la tabla del padre.

Casos de uso en la empresa


Dónde se usan los One2many en procesos reales


1. Pedidos de venta y líneas de pedido

El módulo de Ventas emplea un One2many llamado order_line_ids en sale.order para listar sale.order.line. Cada línea recoge producto, cantidad, precio unitario y descuentos; los usuarios gestionan las líneas directamente desde el formulario del pedido.


2. Facturas y líneas de factura

En Contabilidad, account.move usa un One2many sobre account.move.line para detallar los conceptos facturados. La factura agrega los importes de sus líneas hijas para calcular totales y asientos.


3. Proyectos y tareas

En Proyectos, project.project incluye un One2many para mostrar las tareas vinculadas. Esa relación puede visualizarse como lista, kanban o diagrama de Gantt según la vista elegida.


4. Contactos y subcontactos

El modelo res.partner incluye child_ids para listar personas vinculadas a una empresa. Cada subcontacto guarda un parent_id Many2one que referencia la empresa madre.


5. Modelos a medida en servicios o producción

Al desarrollar módulos personalizados, el One2many es la elección natural cuando un registro «posee» un conjunto de subregistros: por ejemplo, una orden de mantenimiento con varias piezas, un curso con varias sesiones o un contrato con múltiples entregables.


Esa versatilidad explica por qué el One2many es central en la personalización de Odoo y en el modelado de datos por sector.

Crear o personalizar el campo


Formas de crear un One2many: sin código o programando


Hay dos caminos principales: usar Odoo Studio para evitar código, o definir el campo en Python dentro de un módulo personalizado.

Trabajo con Odoo Studio

Studio no permite crear directamente un One2many desde el selector del modelo padre porque necesita que exista antes el Many2one en el modelo hijo.

  1. El flujo recomendado en Studio es sencillo:
  2. Abre el modelo hijo en Studio y añade un Many2one que apunte al modelo padre.
  3. Guarda ese campo y vuelve al modelo padre en Studio.
  4. Crea un nuevo campo de tipo One2many; Studio te pedirá el modelo relacionado y el nombre del Many2one inverso.

Tras ello, el One2many aparecerá como una lista incrustada en el formulario del padre y funcionará igual que un campo definido en Python.


Definirlo mediante código Python

Para desarrolladores, programar el One2many ofrece control total sobre nombres, comportamiento y dominios. Un ejemplo completo típico sería:


from odoo import fields, models

class ServiceContract(models.Model):
    _name = 'service.contract'
    _description = 'Service Contract'

    name = fields.Char(string='Contract Name', required=True)
    deliverable_ids = fields.One2many(
        comodel_name='service.deliverable',
        inverse_name='contract_id',
        string='Deliverables'
    )


class ServiceDeliverable(models.Model):
    _name = 'service.deliverable'
    _description = 'Service Deliverable'

    contract_id = fields.Many2one(
        comodel_name='service.contract',
        string='Contract',
        ondelete='cascade'
    )
    name = fields.Char(string='Description', required=True)

Fíjate en que el Many2one (contract_id) debe existir en el modelo hijo antes de referenciarlo desde el One2many; el inverse_name ha de coincidir exactamente con su nombre.


Crear el campo mediante la API XML-RPC

Si gestionas campos de forma programática, puedes crear One2many usando la API XML-RPC y el modelo ir.model.fields. La regla es la misma: primero definir el Many2one y después el One2many indicando relation_field que apunte al nombre del campo inverso.


Este método resulta útil para automatizar cambios en varios entornos o gestionar personalizaciones desde scripts de despliegue.

Buenas prácticas


Prácticas recomendadas basadas en implantaciones reales


  • Crea siempre antes el Many2one. Sin el campo inverso en el hijo, el One2many no es válido, tanto si trabajas en Studio, en código o con la API.
  • Sigue la convención _ids para nombrar One2many. Nombres como line_ids, task_ids o deliverable_ids dejan claro que devuelven un conjunto de registros.
  • Usa ondelete='cascade' cuando convenga. Si al borrar el padre deben eliminarse también los hijos, activa esta opción en el Many2one para evitar registros huérfanos.
  • Mantén la lista incrustada clara y concisa. Mostrar demasiadas columnas ralentiza la pantalla y dificulta la lectura; usa atributos opcionales para campos secundarios que el usuario pueda activar bajo demanda.
  • Aplica dominios para filtrar hijos visibles. El parámetro domain en la definición del One2many permite mostrar solo los registros relevantes cuando el modelo hijo se comparte entre varios padres.
  • Trata con cuidado los conjuntos grandes. Si un padre puede tener miles de hijos, evita cargarlos todos en el formulario; considera vistas separadas, paginación o límites en la vista embebida.

Errores comunes


Errores frecuentes al trabajar con One2many


Olvidar el Many2one inverso

El fallo más habitual es crear un One2many sin haber definido antes el Many2one en el modelo hijo. Odoo devolverá un error; asegúrate de que el inverse_name existe y está bien escrito.


Sintaxis de escritura incorrecta

Para modificar un One2many desde código o API debes usar las tuplas de comando del ORM; no sirve asignar una lista Python simple.


  • (0, 0, values_dict) para crear un nuevo registro hijo.
  • (1, child_id, values_dict) para actualizar un hijo existente.
  • (2, child_id, 0) para eliminar un hijo existente.
  • (4, child_id, 0) para añadir un hijo ya existente a la relación.
  • (5, 0, 0) para desvincular todos los hijos del padre sin borrarlos.

Intentar hacer record.line_ids = [1, 2, 3] no funciona como espera en el ORM de Odoo; hay que usar los comandos adecuados.


Confundir One2many con Many2many

Recuerda: One2many implica que cada hijo pertenece a un solo padre. Si necesitas que un hijo esté vinculado a varios padres a la vez, utiliza Many2many; usar One2many obligaría a duplicar registros y rompe la integridad de los datos.


Problemas de rendimiento con listas extensas

Mostrar cientos o miles de líneas en un formulario impacta negativamente en tiempos de carga —esto ocurre con frecuencia en facturas o movimientos de inventario. Aplica límites o redirige a una vista lista para estructuras muy grandes.


Registros huérfanos tras eliminar el padre

Si borras el padre sin haber establecido ondelete='cascade' en el Many2one, los hijos pueden quedarse con referencias nulas o inválidas. Esto ensucia la base de datos y provoca errores en informes y vistas; diseña una política de borrado clara desde el principio.

Conclusión


El One2many es un elemento fundamental del ORM y del modelo de datos de Odoo. Alimenta funcionalidades esenciales —líneas de pedido, líneas de factura, tareas de proyecto— y comprender su dependencia con el Many2one en el modelo hijo facilita mucho la lectura y extensión de cualquier instalación Odoo.


Tanto si configuras Odoo para tu empresa, personalizas pantallas con Studio o desarrollas módulos desde cero, usar One2many de forma correcta te ahorrará tiempo y reducirá problemas de datos en el futuro.

Si quieres más guías técnicas y tutoriales sobre campos y API de Odoo, consulta el resto de contenidos de la colección Odoo Data & API.

¿Necesitas ayuda con tu implantación de Odoo?


Dasolo ayuda a empresas a implantar, personalizar y optimizar Odoo según sus procesos. Ya sea para diseñar un modelo de datos, desarrollar módulos a medida, crear campos o extraer más valor de una instalación existente, nuestro equipo acompaña en todo el proyecto.

Si tienes dudas sobre tu proyecto Odoo o quieres comentar la mejor forma de estructurar tus datos, contacta con nosotros,estaremos encantados de ayudarte.

Campo One2many 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