Saltar al contenido

Tipo de modelos en Odoo

🐍 DESARROLLO · PYTHON · ODOO

Tipos de modelos en Odoo

En Odoo, todo modelo hereda de una de cuatro clases base: models.Model, TransientModel, AbstractModel o models.Base. Cada una tiene un propósito distinto, y elegir bien impacta directamente el rendimiento, la mantenibilidad y la escalabilidad de tu módulo.

💾
PERSISTENTE
models.Model

TEMPORAL
TransientModel

🧬
REUTILIZABLE
AbstractModel

🔧
USO INTERNO
models.Base

📋 Comparativa rápida

Tipo ¿Crea tabla? ¿Persistencia? Uso típico
models.Model ✅ Sí Permanente Datos de negocio: clientes, facturas, ventas, inventario.
TransientModel ⏱️ Temporal Auto-borrado Wizards, asistentes, importaciones, configuraciones temporales.
AbstractModel ❌ No N/A Mixins, reportes, funcionalidad reutilizable, lógica compartida.
models.Base Clase raíz interna del framework. Rara vez se usa en módulos.

1
models.Model — el modelo estándar

models.Model es el tipo más común. Representa tablas de base de datos persistentes que almacenan datos de forma permanente. Es lo que usas para casi todo modelo de negocio.

from odoo import models, fields

class SaleOrder(models.Model):
    _name = 'sale.order'
    _description = 'Sales Order'

    name = fields.Char(string='Order', required=True)
    partner_id = fields.Many2one('res.partner')

Características principales:

💾 Persistente
Los datos se almacenan en la base de datos PostgreSQL.

🔁 CRUD completo
Create, Read, Update, Delete sobre los registros.

🧬 Herencia
Soporta herencia de clases y prototipos (_inherit).

🗺️ Mapeo ORM
Relación objeto-relacional completa con campos típicos (Many2one, One2many, Char…).

💡 EJEMPLOS DENTRO DE ODOO
Clientes (res.partner), facturas (account.move), órdenes de venta (sale.order), productos (product.template), inventario (stock.picking) — prácticamente todo lo que ves como “registro de negocio” en la interfaz.
Vista de Ventas — modelo persistente sale.order
Vista de Ventas — modelo persistente sale.order
Vista de Compras — modelo persistente purchase.order
Vista de Compras — modelo persistente purchase.order

2
TransientModel — modelos transitorios

models.TransientModel es un modelo especial cuyos registros se eliminan automáticamente después de un tiempo determinado. Es ideal para operaciones temporales: wizards, procesos batch o configuraciones efímeras.

class SaleAdvancePaymentInv(models.TransientModel):
    _name = 'sale.advance.payment.inv'
    _description = 'Sales Advance Payment Invoice'

    advance_payment_method = fields.Selection([...])
    amount = fields.Float('Down Payment Amount')

Casos de uso típicos:

🧙
Asistentes (wizards)

📥
Import / Export

⚙️
Config temporal

📊
Informes temporales

Asistente para crear facturas de venta — TransientModel
Asistente para crear facturas de venta — TransientModel
Asistente para registro de pago de facturas — TransientModel
Asistente para registro de pago de facturas — TransientModel

3
AbstractModel — modelos abstractos

models.AbstractModel es un modelo base que no crea tabla en la base de datos. Se utiliza para definir comportamientos y campos comunes que serán reutilizados por otros modelos vía herencia múltiple.

class MailThread(models.AbstractModel):
    _name = 'mail.thread'
    _description = 'Email Thread'

    # Lógica reutilizable de mensajería

class SaleOrder(models.Model):
    _inherit = ['sale.order', 'mail.thread']

Características principales:

🚫 No persistente
No crea tabla en la base de datos.

♻️ Reutilizable
Soporta herencia múltiple sin conflictos.

🧩 Mixins
Perfecto para crear mixins de funcionalidad transversal.

⛔ Sin instancias
No se pueden crear registros directamente.

💡 USOS COMUNES
Reportes (report.module.report_xml), funcionalidades transversales como envío de correos o logging, campos computados compartidos entre varios modelos.
Envío de correo de facturas — AbstractModel detrás del flujo
Envío de correo de facturas — AbstractModel detrás del flujo
Secuencias de facturas — AbstractModel reutilizado en varios modelos
Secuencias de facturas — AbstractModel reutilizado en varios modelos

4
models.Base — la raíz de todo

models.Base es la clase raíz de la que heredan todos los modelos de Odoo. Rara vez se usa directamente en desarrollo de módulos, pero entender su rol ayuda a debuggear comportamientos extraños del ORM.

🌳 Clase base
Todas las clases de modelo heredan de ella indirectamente.

🔧 Metaclass
Define el comportamiento de creación de modelos.

📋 Registro automático
Registra modelos en el pool al cargar el módulo.

⚙️ Configuración ORM
Establece la base del mapeo objeto-relacional.

🌳 Jerarquía de herencia

models.Base (raíz)
  ├── models.AbstractModel (no crea tabla)
  ├── models.Model (persistente)
  └── models.TransientModel (temporal)

🤔 ¿Cuál tipo elegir?

¿Los datos deben persistir?
Sí → models.Model. Para todo lo que sea registro de negocio que el usuario consulta a futuro.

¿Es una interfaz temporal?
Sí → TransientModel. Para wizards, asistentes y operaciones que se descartan tras ejecutarse.

¿Funcionalidad reutilizable?
Sí → AbstractModel. Para mixins, reportes y lógica que comparten varios modelos.

¿Necesitas tocar el framework?
Solo entonces → models.Base. En 99% de los módulos no debería aparecer.

📌 En resumen

Comprender los tipos de modelos en Odoo es fundamental para desarrollar aplicaciones eficientes y mantenibles. Cada uno cumple un propósito: Model para datos de negocio, TransientModel para operaciones temporales, AbstractModel para funcionalidad reutilizable y Base como raíz interna.

Antes de declarar un modelo, hazte tres preguntas: ¿debe persistir?, ¿es reutilizable?, ¿es temporal? La respuesta te lleva a la clase correcta. En Exdoo desarrollamos módulos a medida en Odoo 17, 18 y 19 — escríbenos si tu equipo necesita extender la plataforma sin sacrificar mantenibilidad.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¿Te gustaría implementar Odoo en tu empresa?

12 años de experiencia · +60 implementaciones exitosas · Partner Gold de Odoo en México

Hablemos por WhatsApp