Saltar al contenido

Método ORM (Object-Relational Mapping)

🐍 DESARROLLO · ODOO · ORM

Métodos ORM en Odoo

El ORM (Object-Relational Mapping) es la capa que abstrae PostgreSQL en Odoo. Te permite crear, leer, actualizar, buscar, filtrar y mapear registros sin escribir SQL — y aplica seguridad, multi-compañía, herencia y caché de forma automática. Esta guía recorre los métodos esenciales que todo developer Odoo debe dominar.

🔁
CRUD
create, read, write, unlink

🔍
BÚSQUEDA
search, search_count, search_read

🛠️
UTILIDAD
browse, exists, copy

AVANZADOS
filtered, sorted, mapped

Los métodos ORM facilitan las operaciones básicas (CRUD), simplifican el desarrollo y permiten al developer concentrarse en la lógica de negocio en lugar de los detalles de PostgreSQL. Ningún módulo Odoo se escribe sin tocarlos a diario.

1
¿Por qué el ORM es importante en Odoo?

🗄️ Abstracción de la BD
No necesitas conocer PostgreSQL ni escribir SQL. El ORM maneja diferencias entre motores y se encarga de la traducción.

🔐 Seguridad integrada
Aplica automáticamente las reglas de Odoo: permisos de usuario, reglas de acceso por registro y restricciones multi-compañía.

📐 Consistencia y mantenibilidad
Todos los developers usan la misma API — código más legible, predecible y fácil de auditar.

⚙️ Funcionalidades avanzadas
Campos computados, herencia de modelos, validación de datos y caché inteligente — todo gratis al usar el ORM.

2
Operaciones CRUD

Las cuatro operaciones fundamentales con cualquier modelo Odoo:

2.1 — Crear registros

create()
self.env[‘model’].create({…})
Crea uno o múltiples registros nuevos en la base de datos. Acepta un diccionario o lista de diccionarios con los valores iniciales.
Ejemplo de uso del método create

2.2 — Leer registros

read()
records.read([‘campo1’, ‘campo2’])
Obtiene los valores de campos específicos de los registros. Devuelve una lista de diccionarios con la información solicitada.
Ejemplo de uso del método read

2.3 — Actualizar registros

write()
records.write({‘campo’: nuevo_valor})
Actualiza los valores de uno o múltiples registros del recordset. Acepta un diccionario con los campos a modificar.
Ejemplo de uso del método write

2.4 — Eliminar registros

unlink()
records.unlink()
Permite eliminar uno o múltiples registros del recordset. Aplica las verificaciones de integridad y permisos correspondientes.
Ejemplo de uso del método unlink
⚠️ unlink IRREVERSIBLE
A diferencia de muchos sistemas, unlink() elimina de verdad los registros (no es un borrado lógico). Si necesitas auditoría o “papelera de reciclaje”, implementa un campo active y usa el patrón de archivado de Odoo.

3
Métodos de búsqueda y consulta

Cuando ya tienes datos en la BD y necesitas localizarlos, estos son tus aliados. Todos aceptan un dominio (lista de tuplas) como filtro:

3.1 — Buscar registros

search()
self.env[‘model’].search([(‘campo’, ‘=’, valor)])
Busca registros que cumplan un dominio. Devuelve un recordset con los resultados.
Ejemplo de uso del método search con un dominio

3.2 — Contar registros

search_count()
self.env[‘model’].search_count([…])
Devuelve el número de registros que cumplen el dominio, sin cargar los registros completos. Más eficiente que search() seguido de len().
Ejemplo de uso de search_count

3.3 — Buscar y leer en una sola operación

search_read()
self.env[‘model’].search_read(domain, fields)
Combina search() y read() en una sola llamada. Útil cuando solo necesitas valores específicos sin instanciar todo el recordset.
Ejemplo de uso de search_read
💡 RENDIMIENTO
Para grandes volúmenes y solo necesitas leer datos, prefiere search_read() sobre search() seguido de iterar el recordset — evita cargar campos innecesarios y reduce el roundtrip a la BD.

4
Métodos de utilidad

Operaciones comunes sobre recordsets que ya conoces o sobre los que tienes una referencia directa:

4.1 — Obtener registros por ID

browse()
self.env[‘model’].browse([1, 2, 3])
Obtiene registros específicos a partir de sus IDs. No hace una query inmediata — el lazy loading se ejecuta al acceder a un campo.
Ejemplo de uso del método browse

4.2 — Verificar existencia

exists()
records.exists()
Devuelve solo los registros del recordset que aún existen en la BD. Útil tras manipulaciones donde otros procesos pueden haber eliminado registros.
Ejemplo de uso de exists

4.3 — Asegurar un solo registro

ensure_one()
record.ensure_one()
Garantiza que el recordset contiene exactamente un registro. Si tiene cero o más de uno, lanza ValueError. Esencial al operar sobre ‘un’ registro específico.
Ejemplo de uso de ensure_one

4.4 — Copiar registros

copy()
record.copy({‘name’: ‘Nueva copia’})
Crea una copia del registro. Por defecto duplica todos los campos copyables; puedes pasar un dict con valores override.
Ejemplo de uso del método copy

5
Métodos avanzados sobre recordsets

Estos métodos operan en memoria sobre un recordset ya cargado — no hacen consultas adicionales a la BD. Son la herramienta idiomática para transformar datos en Python:

5.1 — Filtrar registros

filtered()
records.filtered(lambda r: r.estado == ‘done’)
Filtra el recordset con una función o un nombre de campo. Útil cuando ya tienes los datos cargados y necesitas un subconjunto.
Ejemplo de uso del método filtered

5.2 — Ordenar registros

sorted()
records.sorted(key=’date’, reverse=True)
Ordena el recordset según una clave (función o nombre de campo). El parámetro reverse=True invierte el orden.
Ejemplo de uso del método sorted

5.3 — Mapear valores

mapped()
records.mapped(‘partner_id.name’)
Extrae valores de campos o aplica una función a cada registro. Devuelve una lista (o recordset si el campo es relacional).
Ejemplo de uso del método mapped
✅ TRUCO PRÁCTICO
Los tres métodos avanzados se encadenan con elegancia: orders.filtered('confirmed').sorted('date').mapped('total') es código completamente legible y muy difícil de hacer mal. Es uno de los lugares donde Odoo realmente brilla.

📋 Tabla resumen

Categoría Método Para qué sirve
CRUD create() Crear registros
read() Leer campos específicos
write() Actualizar registros
unlink() Eliminar registros
Búsqueda search() Buscar por dominio
search_count() Contar resultados
search_read() Buscar + leer en una llamada
Utilidad browse() Obtener por ID
exists() Verificar existencia
ensure_one() Garantizar un único registro
copy() Duplicar registros
Avanzados filtered() Filtrar en memoria
sorted() Ordenar recordset
mapped() Extraer / transformar valores

📌 En resumen

El ORM de Odoo no es solo una característica técnica — es la forma estándar y recomendada de interactuar con datos. Te permite enfocarte en la lógica de negocio en lugar de las complejidades de PostgreSQL, haciendo tu desarrollo más rápido, seguro y mantenible.

En esencia: el ORM es tu mejor aliado para transformar ideas de negocio en código funcional. Las cuatro categorías cubren el 95% de las necesidades reales — domina estas trece llamadas y serás autosuficiente para cualquier módulo Odoo. En Exdoo compartimos contenido técnico para developers Odoo y desarrollamos módulos a medida con buenas prácticas de ORM desde el primer commit.

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