Ir al contenido

Campo One2many en Odoo: Guía Completa

Cómo funciona el campo One2many en Odoo, cuándo usarlo y cómo implementarlo en tu modelo de datos
6 de marzo de 2026 por
Campo One2many en Odoo: Guía Completa
Dasolo
| Sin comentarios aún

Introduction


Si alguna vez has abierto una Orden de Venta en Odoo y has notado la lista de líneas de pedido debajo de los detalles del cliente, ya has visto el campo One2many en acción. Es uno de los bloques de construcción más importantes en el modelo de datos de Odoo, y entender cómo funciona es esencial para cualquier persona involucrada en el desarrollo o personalización de Odoo.


Esta guía explica qué es el campo One2many, cómo funciona en el ORM de Odoo, cuándo usarlo en tu propia configuración y cómo crearlo o configurarlo ya sea a través de Odoo Studio o directamente en código Python.

Ya seas un usuario empresarial tratando de entender cómo está estructurada tu información, o un desarrollador buscando un tutorial práctico sobre campos de Odoo, este artículo cubre lo que necesitas saber.

What is the One2many Field in Odoo


El campo One2many es un tipo de campo relacional en el marco de Odoo. Permite que un único registro padre esté vinculado a múltiples registros hijos de otro modelo.


Piénsalo de esta manera: un Cliente puede tener muchas Facturas. Un Pedido de Venta puede contener muchas Líneas de Pedido. Un Proyecto puede tener muchas Tareas. El registro padre mantiene una referencia a todos los registros hijos relacionados a través del campo One2many.


En la interfaz de Odoo, un campo One2many típicamente aparece como una lista incrustada directamente dentro de una vista de formulario. Esta tabla en línea permite a los usuarios agregar, editar o eliminar registros hijos sin salir del formulario padre. Es uno de los patrones más visibles y utilizados con frecuencia en la interfaz de usuario de Odoo.


Cómo se Diferencia de Otros Campos Relacionales

Odoo tiene tres tipos principales de campos relacionales en su ORM:


  • Many2one: Un único registro que apunta a un registro en otro modelo (por ejemplo, un Pedido de Venta que apunta a un Cliente).
  • One2many: Un único registro vinculado a múltiples registros en otro modelo (por ejemplo, un Pedido de Venta vinculado a muchas Líneas de Pedido).
  • Many2many: Múltiples registros en ambos lados vinculados entre sí (por ejemplo, un Producto vinculado a múltiples Etiquetas, y cada Etiqueta vinculada a múltiples Productos).

El One2many se utiliza específicamente cuando un registro hijo pertenece a un único padre. Si un registro hijo necesita ser compartido entre múltiples padres, Many2many es la opción correcta.


Entre los tipos de campos de Odoo, el One2many es único porque no almacena ningún dato por sí mismo. Es un campo virtual que lee datos del modelo hijo utilizando un campo Many2one en ese hijo como su punto de anclaje.

Cómo funciona el campo


Detrás de escena, el campo One2many no almacena nada en la tabla de base de datos del modelo padre. En su lugar, se basa en un campo Many2one que existe en el modelo hijo y apunta de vuelta al padre.


Este es un principio fundamental en el ORM de Odoo: cada campo One2many tiene un campo Many2one correspondiente en el modelo relacionado. El One2many es esencialmente una búsqueda inversa. Odoo encuentra todos los registros hijos donde el campo Many2one es igual al ID del registro padre actual.


La relación entre One2many y Many2one

Cuando defines un campo One2many en Python, especificas 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 apunta de vuelta al padre.

Aquí hay un ejemplo simple de un módulo Odoo personalizado, que muestra cómo un Contrato de Servicio se vincula a múltiples registros Entregables:


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

En este ejemplo, contract_id es un campo Many2one en el modelo service.deliverable que apunta de vuelta al contrato. Sin que ese Many2one exista primero, el One2many no puede funcionar.


Qué sucede en la base de datos

En la base de datos de Odoo, no se almacena nada en la tabla padre para un campo One2many. Los datos residen en la tabla del modelo hijo, donde cada fila hija tiene una columna de clave externa que apunta al ID del registro padre.

Cuando Odoo carga un registro padre y necesita mostrar su campo One2many, ejecuta una consulta SQL equivalente a: encontrar todas las filas en la tabla hija donde la clave externa coincide con el ID del padre actual. Este es un comportamiento estándar de bases de datos relacionales, y el ORM de Odoo lo maneja automáticamente.


Este diseño también es la razón por la cual el campo One2many se considera parte de los campos de Python de Odoo que no añaden columnas a la base de datos. Es puramente una vista computada de registros relacionados.

Casos de Uso Empresariales


Los campos One2many aparecen en todo Odoo porque modelan naturalmente las relaciones padre-hijo del mundo real. Aquí hay cinco ejemplos prácticos extraídos de flujos de trabajo comerciales comunes.


1. Pedidos de Venta y Líneas de Pedido

El módulo de Ventas utiliza un campo One2many llamado order_line_ids en el modelo sale.order para vincularse a sale.order.line. Cada línea almacena un producto, cantidad, precio unitario y descuento. Los usuarios pueden agregar o eliminar líneas directamente desde el formulario del Pedido de Venta sin necesidad de navegar fuera.


2. Facturas y Líneas de Factura

En el módulo de Contabilidad, el modelo account.move utiliza un campo One2many para gestionar las líneas de factura (account.move.line). Cada línea representa un producto o servicio cobrado al cliente. La factura principal agrega los totales de todas sus líneas secundarias.


3. Proyectos y Tareas

El módulo de Proyecto utiliza un campo One2many en project.project para mostrar todas las tareas que pertenecen a ese proyecto. En la vista de formulario, esto puede aparecer como una lista, un tablero kanban o un gráfico de Gantt, todos impulsados por la misma relación One2many subyacente.


4. Contactos y Sub-contactos

El modelo res.partner tiene un campo One2many child_ids que lista todos los contactos individuales vinculados a una empresa. Cuando abres un registro de empresa, la pestaña de Contactos muestra todos los empleados o personas de contacto. Cada uno de esos sub-contactos tiene un campo Many2one (parent_id) que apunta de vuelta a la empresa.


5. Modelos Personalizados en Servicio o Fabricación

Al construir un módulo Odoo personalizado, el campo One2many es la opción natural para cualquier escenario donde un registro posee una lista de sub-registros. Ejemplos incluyen: una solicitud de mantenimiento vinculada a múltiples piezas de repuesto utilizadas, un curso de formación vinculado a múltiples fechas de sesión, o un contrato de servicio vinculado a una lista de entregables.


Esta flexibilidad es una de las razones por las que el campo One2many es tan central para la personalización de Odoo y para construir modelos de datos a medida para diferentes industrias.

Crear o Personalizar el Campo


Hay dos formas principales de agregar un campo One2many en Odoo: utilizando Odoo Studio para un enfoque sin código, o escribiendo código Python directamente en un módulo personalizado.


Uso de Odoo Studio

Odoo Studio no te permite crear un campo One2many directamente desde el selector de campos en el modelo padre. Esto se debe a que el One2many siempre requiere que un Many2one ya exista en el modelo hijo primero.

El proceso recomendado en Studio es:

  1. Abre el modelo hijo en Studio y añade un campo Many2one que apunte al modelo padre.
  2. Una vez que el Many2one esté guardado, vuelve al modelo padre en Studio.
  3. Añade un nuevo campo y elige el tipo "One2many". Studio te pedirá que selecciones el modelo relacionado y el campo Many2one inverso.
  4. El campo One2many aparecerá entonces como una lista incrustada en tu vista de formulario.

Para muchos usuarios empresariales, este es el camino más sencillo para crear relaciones One2many sin escribir ningún código. Los campos de Odoo Studio creados de esta manera se comportan exactamente como sus equivalentes en Python.


Uso de código Python en un módulo personalizado

Para los desarrolladores que trabajan en proyectos de desarrollo de Odoo, definir campos One2many en Python ofrece un control total sobre el comportamiento, la nomenclatura y los filtros de dominio. Aquí hay un ejemplo completo:


from odoo import fields, models

class ServiceContract(models.Model):
    _name = 'service.contract'
    _description = 'Contrato de Servicio'

    name = fields.Char(string='Nombre del Contrato', required=True)
    deliverable_ids = fields.One2many(
        comodel_name='service.deliverable',
        inverse_name='contract_id',
        string='Entregables'
    )


class ServiceDeliverable(models.Model):
    _name = 'service.deliverable'
    _description = 'Entregable de Servicio'

    contract_id = fields.Many2one(
        comodel_name='service.contract',
        string='Contrato',
        ondelete='cascade'
    )
    name = fields.Char(string='Descripción', required=True)

Observa que el campo Many2one (contract_id) se define primero en el modelo hijo. El inverse_name en la definición de One2many debe coincidir exactamente con el nombre del campo Many2one.


Creando el campo a través de la API XML-RPC

Si gestionas los campos de la base de datos de Odoo programáticamente, también puedes crear campos One2many a través de la API XML-RPC utilizando el modelo ir.model.fields. El proceso sigue la misma regla: crea el Many2one primero, luego define el One2many utilizando el parámetro relation_field que apunta al nombre del campo Many2one.


Este enfoque es particularmente útil al gestionar campos de la base de datos de Odoo en múltiples entornos o al automatizar flujos de trabajo de personalización de Odoo.

Mejores Prácticas


Basado en la experiencia de implementar Odoo para clientes en diferentes industrias, aquí están las prácticas clave que marcan la diferencia al trabajar con campos One2many.


  • Siempre crea el Many2one primero. El One2many no puede existir sin su campo inverso. Ya sea que estés utilizando Studio, código Python o la API, el Many2one en el modelo hijo debe existir antes de que definas el One2many en el padre.
  • Usa el sufijo _ids para los nombres de los campos. Por convención en Odoo, los campos One2many se nombran con el sufijo _ids, por ejemplo line_ids, task_ids, deliverable_ids. Esto deja claro en el código que el campo devuelve un conjunto de registros.
  • Establece ondelete='cascade' cuando sea apropiado. Si los registros hijos deben ser eliminados automáticamente cuando se elimina el padre, establece esta opción en el campo Many2one. Esto previene la acumulación de registros huérfanos en tu base de datos.
  • Mantén la lista incrustada enfocada. Solo muestra las columnas más relevantes en la vista de lista One2many. Mostrar demasiadas columnas hace que el formulario sea lento y difícil de leer. Usa el atributo optional para columnas secundarias que los usuarios puedan activar o desactivar.
  • Usa filtros de dominio para restringir los registros hijos visibles. Puedes agregar un parámetro domain a la definición del campo One2many para limitar qué registros hijos se muestran según condiciones específicas. Esto es útil cuando un modelo hijo se comparte entre varios modelos padre.
  • Maneja conjuntos de datos grandes con cuidado. Si un registro padre puede tener miles de registros hijos, evita cargarlos todos a la vez en la vista de formulario. Considera usar una vista de lista separada o agregar paginación a la tabla incrustada.

Errores Comunes


Aquí están los errores más frecuentes que surgen al trabajar con campos One2many en Odoo, ya sea en desarrollo o en configuración.


Olvidar el inverso Many2one

El error más común al crear campos en Odoo es definir un One2many sin antes crear el correspondiente Many2one en el modelo hijo. Odoo generará un error porque el campo inverso no existe. Siempre verifica que el inverse_name que especificas realmente exista en el modelo hijo.


Uso de la Sintaxis de Escritura Incorrecta

Al actualizar un campo One2many a través de código Python o la API, necesitas usar la sintaxis de tuplas de comandos de Odoo. No puedes asignar una lista de Python simple a un campo One2many. La forma correcta de usar los comandos de escritura es la siguiente:


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

Intentar escribir una lista simple como record.line_ids = [1, 2, 3] no funcionará como se espera en el ORM de Odoo.


Confundir One2many con Many2many

Un One2many significa que cada registro hijo pertenece exactamente a un padre. Si te encuentras necesitando que un registro hijo esté vinculado a múltiples padres simultáneamente, la elección correcta es un campo Many2many, no un One2many. Usar One2many en ese escenario te obligaría a duplicar registros, lo que crea problemas de integridad de datos.


Problemas de Rendimiento con Sub-listas Grandes

Si un campo One2many muestra cientos o miles de líneas en una vista de formulario, la carga de la página se ralentizará significativamente. Este es un problema común en Contabilidad (líneas de factura) e Inventario (líneas de movimiento de stock). Utilice el atributo limit en la vista de lista o redirija a los usuarios a una vista de lista separada para conjuntos de datos grandes.


Registros huérfanos después de la eliminación

Si elimina un registro padre sin establecer ondelete='cascade' en el campo Many2one del hijo, los registros hijos pueden permanecer en la base de datos con una referencia de padre nula o inválida. Con el tiempo, esto puede desordenar su base de datos y causar comportamientos inesperados en vistas e informes. Siempre defina una política de eliminación clara al diseñar su modelo de datos.

Conclusión


El campo One2many es una pieza fundamental del ORM de Odoo y del modelo de datos de Odoo. Potencia algunas de las características más esenciales de la plataforma, desde líneas de pedidos de venta hasta líneas de factura y tareas de proyecto. Una vez que comprenda cómo funciona y cómo se relaciona con el campo Many2one en el modelo hijo, gran parte de la estructura interna de Odoo se vuelve mucho más fácil de leer y extender.


Ya sea que esté configurando Odoo para su negocio, personalizándolo a través de Studio, o construyendo un módulo personalizado desde cero, el campo One2many será una herramienta que utilizará con regularidad. Saber cuándo usarlo, cómo definirlo correctamente y cómo evitar errores comunes le ahorrará mucho tiempo y evitará problemas de datos en el futuro.

Si está buscando más tutoriales sobre campos de Odoo y guías técnicas, explore los otros artículos en la colección de Datos y API de Odoo.

¿Necesitas ayuda con tu implementación de Odoo?


Dasolo ayuda a las empresas a implementar, personalizar y optimizar Odoo para adaptarse a sus necesidades comerciales específicas. Ya sea que necesite ayuda para diseñar su modelo de datos, construir módulos personalizados, crear campos en Odoo, o simplemente obtener más valor de su configuración existente, nuestro equipo está listo para ayudar.

Si tiene preguntas sobre su proyecto de Odoo o desea discutir cómo estructurar mejor sus datos, póngase en contacto con nosotros. Estamos felices de ayudar.

Campo One2many en Odoo: Guía Completa
Dasolo 6 de marzo de 2026
Compartir esta publicación
Iniciar sesión para dejar un comentario