Ir al contenido

Campos Computados Almacenados en Odoo: Guía Completa

Descubre qué son los campos computados almacenados en Odoo, en qué situaciones resultan útiles y cómo implementarlos tanto con código Python como con Odoo Studio.
6 de marzo de 2026 por
Campos Computados Almacenados en Odoo: Guía Completa
Dasolo
| Sin comentarios aún

Introducción


Si trabajas con Odoo seguro te has topado con campos cuyo valor se determina automáticamente. Un campo computado almacenado va más allá: la plataforma ejecuta la lógica que calcula su valor y lo guarda en la base de datos como si fuera una columna más.


Esa diferencia tiene implicaciones prácticas. Un campo que solo se calcula al vuelo no es fácilmente buscable ni se puede agrupar ni exportar con eficiencia. En cambio, un campo computado almacenado se puede usar en búsquedas, filtros, agrupaciones y reportes porque su valor persiste en la base de datos.


Esta guía recopila lo esencial sobre los campos computados almacenados en Odoo: cómo actúan dentro del modelo de datos, cómo crearlos con Odoo Studio o con código Python, ejemplos reales de uso en negocio y los errores más habituales que conviene evitar.

¿Qué es un campo computado almacenado en Odoo?


En el ORM de Odoo, cada campo de un modelo guarda un dato. La mayoría son valores que el usuario introduce. Un campo computado, en cambio, obtiene su valor mediante una función Python en lugar de esperar una entrada manual.


Un campo computado almacenado es, básicamente, un campo computado con store=True. Cuando cambian sus dependencias, Odoo ejecuta la función de cálculo y escribe el resultado en la columna de la base de datos, dejando el valor disponible como cualquier otro campo.


En Python la estructura típica sigue un patrón sencillo:

total_amount = fields.Float(
    string='Total Amount',
    compute='_compute_total_amount',
    store=True,
)

@api.depends('quantity', 'unit_price')
def _compute_total_amount(self):
    for record in self:
        record.total_amount = record.quantity * record.unit_price

El parámetro clave es store=True. Sin él, el valor se recalcula cada vez que se lee y nunca queda persistido en la base de datos.


En la interfaz de Odoo, un campo computado almacenado no se distingue visualmente de cualquier otro campo. Aparece en formularios, vistas de lista e informes; los usuarios pueden filtrar, agrupar o exportar usando ese campo sin notar que su valor proviene de una lógica.


Almacenado frente a no almacenado

Comprender esta distinción es básico para cualquier trabajo de desarrollo en Odoo:

  • Campo computado no almacenado: se calcula al leer el registro. No sirve para búsquedas, filtros ni agrupaciones en SQL. Consume menos espacio, pero no participa en consultas de la base de datos.
  • Campo computado almacenado: se calcula cuando cambian las dependencias y se guarda en la base de datos. Puede buscarse, filtrarse y exportarse. Ocupa espacio en la tabla como cualquier columna normal.

No existe una opción universalmente mejor: la elección depende del uso. Si solo necesitas mostrar el resultado en un formulario puntual, un campo no almacenado suele ser suficiente. Si hay que ordenar, filtrar o agregar por ese valor, entonces debe almacenarse.

Cómo funciona el campo


Al definir un campo computado almacenado, el ORM de Odoo crea disparadores de recomputación automáticos según las dependencias que declares con @api.depends().


Cuando cualquiera de esos campos cambia en un registro, Odoo marca el registro para recalcularlo, ejecuta la función compute y escribe el valor en la columna correspondiente.


El ciclo de recomputación

A grandes rasgos, esto es lo que ocurre paso a paso:

  1. Un usuario o proceso modifica un campo incluido en @api.depends().
  2. Odoo detecta el cambio y localiza los registros afectados por esa dependencia.
  3. Se invoca la función compute para esos registros.
  4. El valor resultante se escribe en la columna de la base de datos.
  5. A partir de entonces, el campo puede usarse en búsquedas, filtros o exportaciones con el valor actualizado.

Normalmente la recomputación se ejecuta de forma inmediata dentro de la misma transacción. En operaciones masivas, Odoo puede posponer ciertas recomputaciones y procesarlas en segundo plano para evitar bloquear el sistema.


Dependencias entre modelos relacionados

El decorador @api.depends() admite rutas con puntos para referenciar campos en modelos relacionados. Por ejemplo:


@api.depends('partner_id.country_id.name')
def _compute_country_name(self):
    for record in self:
        record.country_name = record.partner_id.country_id.name or ''

Con eso, Odoo vigila cambios en partner_id, country_id y name a través de distintos modelos. Si cambia el nombre del país en el socio, los registros relacionados se vuelven a calcular automáticamente: una capacidad poderosa del framework de Odoo.


Impacto en la base de datos

Al almacenarse, Odoo crea una columna real en la tabla PostgreSQL del modelo. Eso permite que el campo participe directamente en consultas SQL: las búsquedas y filtros sobre campos almacenados son rápidas y eficientes, igual que sobre campos estándar.

Casos de uso en la empresa


Los campos computados almacenados aparecen en múltiples áreas de Odoo. A continuación, cinco ejemplos prácticos extraídos de flujos de trabajo reales.


1. Ventas: porcentaje de margen en líneas de pedido

El equipo comercial necesita ver el margen en cada línea sin cálculos manuales. Un campo almacenado toma precio de venta y coste, calcula el margen y lo guarda en la línea. El responsable puede filtrar por márgenes, localizar rápidamente líneas no rentables y agrupar pedidos por franjas de margen en vistas pivot.


2. CRM: días sin actividad en un lead

Un campo almacenado en el modelo de Leads puede registrar cuántos días han pasado desde la última actividad programada. Combinado con una acción programada que fuerce la recomputación cada mañana, el equipo comercial puede filtrar los leads por inactividad y priorizar seguimientos automáticamente.


3. Inventario: cantidad neta disponible

Para productos con reglas de stock complejas, un campo almacenado puede contener un valor precomputado como stock disponible menos reservado. Al estar en la base de datos, los gestores pueden ordenar y filtrar el listado de productos por disponibilidad sin calcular reglas de stock en tiempo real por cada fila.


4. Contabilidad: número de facturas vencidas por cliente

En la ficha del cliente, un campo almacenado puede contar cuántas facturas están vencidas. El equipo contable puede ordenar rápidamente contactos por número de vencimientos, algo que sólo es práctico si ese conteo está persistido en la base de datos.


5. Fabricación: duración total estimada de trabajo

En una lista de materiales (BOM), un campo almacenado puede sumar la duración estimada de todas las operaciones de centro de trabajo asociadas. Los planificadores pueden filtrar y ordenar BOMs por tiempo total, útil para capacidad y programación. Cada vez que se añade o modifica una operación, el total se actualiza automáticamente.

Crear o personalizar el campo


Existen dos vías principales para crear campos computados almacenados en Odoo: Odoo Studio para casos sencillos y módulos Python personalizados para control total.


Usar Odoo Studio

Odoo Studio permite añadir campos computados sin código. Al crear un campo de tipo Integer, Float o Monetary, Studio ofrece una opción de fórmula donde puedes escribir una expresión tipo Python. Studio se encarga del tracking de dependencias en las operaciones más comunes.


Los campos calculados con Studio encajan bien cuando la lógica es una expresión aritmética simple entre campos del mismo registro. Son rápidos de implementar y no requieren entorno de desarrollo. Pero tienen límites: si necesitas campos de modelos relacionados, ramas condicionales complejas o agregaciones entre hijos, Studio se queda corto y necesitarás un módulo personalizado.


Esa diferencia importa al planificar una personalización: Studio es eficaz para casos directos; cuando la lógica se complica, Python te da la flexibilidad necesaria.


Usar un módulo Python personalizado

Cuando la lógica supera una simple fórmula, defines el campo en Python dentro de un módulo Odoo. Un ejemplo típico sería añadir un campo de porcentaje de margen a las líneas de pedido de venta:


from odoo import models, fields, api

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

    x_margin_pct = fields.Float(
        string='Margin %',
        compute='_compute_margin_pct',
        store=True,
        digits=(5, 2),
    )

    @api.depends('price_unit', 'purchase_price')
    def _compute_margin_pct(self):
        for line in self:
            if line.price_unit:
                line.x_margin_pct = (
                    (line.price_unit - line.purchase_price) / line.price_unit
                ) * 100
            else:
                line.x_margin_pct = 0.0

Al instalar el módulo, Odoo crea la columna x_margin_pct en la base de datos, ejecuta la recomputación para los registros existentes y comienza a rastrear cambios en price_unit y purchase_price a partir de ese momento.


El prefijo x_ es la convención para campos personalizados en Odoo y ayuda a evitar colisiones con campos del núcleo; es una práctica habitual en desarrollo Odoo.


Hacer editable un campo computado almacenado

Por defecto los campos computados son de solo lectura. Si quieres permitir que un usuario sobrescriba el valor, debes definir, además del compute, un método inverse que se ejecuta cuando alguien escribe en el campo y que actualiza los campos fuente según corresponda. Es útil cuando el cálculo proporciona un valor por defecto pero ocasionalmente necesita ajuste manual.


Campos de Studio y la API XML-RPC

Si gestionas campos de modelo vía la API XML-RPC puedes crear campos estándar a través de ir.model.fields. Pero la lógica de un campo computado almacenado (la función compute) debe residir en el servidor en código Python. La API sirve para aprovisionar campos simples en despliegues automatizados, pero la lógica de cálculo siempre requiere un módulo instalado en el servidor.

Buenas prácticas


A continuación, las prácticas que suelen seguir consultores experimentados al trabajar con campos computados almacenados.


Declara todas las dependencias con precisión

En @api.depends() debes listar absolutamente cada campo que tu compute lea. Si omites alguno, la actualización no se disparará cuando esa dependencia cambie. Revisa tu método compute línea por línea y enumera cada acceso a campos en el decorador.


Mantén las funciones compute rápidas

La función compute se ejecuta para cada registro afectado por un cambio. En instancias muy activas puede implicar miles de registros. Evita consultas adicionales a la base de datos dentro del compute. Si necesitas datos relacionados, usa campos ya cargados en memoria en lugar de lanzar búsquedas innecesarias.


Usa store=True solo cuando haga falta

Los campos almacenados consumen espacio y generan operaciones de escritura en cada recomputación. Si solo muestras el valor en una vista y nunca filtras ni agrupas por él, un campo no almacenado será más ligero. Decide con criterio en lugar de marcar store=True por defecto.


Gestiona casos límite en la función compute

Controla valores vacíos o nulos en el compute. Divisiones por cero, registros relacionados ausentes o valores nulos son causas comunes de errores silenciosos. Añade comprobaciones explícitas y valores por defecto seguros cuando la operación normal no sea posible.


Planifica la recomputación inicial en tablas grandes

Al añadir un campo computado almacenado, Odoo lo recalcula para todos los registros existentes. En tablas con cientos de miles de filas puede suponer mucho tiempo. Prueba la migración en staging y planifica ventanas de despliegue o procesamiento en segundo plano para producción.


Evita dependencias circulares

Si el campo A depende de B y B depende de A, Odoo lanzará un error al cargar el módulo. Diseña dependencias que fluyan en una sola dirección.

Errores frecuentes


Olvidar store=True

Este es el fallo más frecuente: durante pruebas el campo parece correcto en la vista, pero luego alguien intenta añadirlo como filtro o en un informe y no funciona. Antes de implementar la lógica, decide si el campo debe ser buscable; si la respuesta es sí, añade store=True desde el principio.


No declarar una dependencia en @api.depends

Si tu compute lee partner_id.country_id pero solo has puesto partner_id en el decorador, los cambios en el país no gatillarán la recomputación. Traza la ruta completa de cada acceso a campo y lista cada paso en el decorador.


Errores silenciosos en la función compute

Si la función compute lanza una excepción para un registro, Odoo suele omitir la recomputación de ese registro y mantiene el valor antiguo. El error queda en logs del servidor y no se refleja al usuario, lo que puede provocar valores obsoletos difíciles de detectar. Testea la función con datos incompletos o atípicos.


Degradación de rendimiento con datasets grandes

Un compute que funciona en desarrollo puede convertirse en cuello de botella si la tabla crece. Observa cuántas consultas adicionales ejecuta tu método por registro: una consulta extra multiplicada por diez mil registros significa diez mil consultas en una operación de guardado.


Uso de sudo() dentro de compute

Llamar a sudo() en un compute para saltarse permisos es un riesgo de seguridad. Si el valor computado expone datos que el usuario no debería ver, devolverlos desde un compute vulnera el modelo de permisos de Odoo. Emplea sudo() solo tras un análisis consciente de las implicaciones de seguridad.


Esperar recomputación inmediata en todos los contextos

En operaciones interactivas la recomputación suele ser síncrona, pero en importaciones masivas, jobs en background o ciertas operaciones ORM con flags de contexto, Odoo puede diferir la recomputación. No asumas que el valor almacenado está actualizado justo en el mismo instante de cualquier escritura; verifica el comportamiento en el contexto concreto donde usarás el campo.

Conclusión


Los campos computados almacenados son una herramienta muy valiosa al construir o ampliar Odoo. Permiten automatizar cálculos, mantener coherencia en los datos y hacer registros buscables y exportables sin trabajo manual por parte del usuario.


Puntos clave que no debes olvidar:

  • Activa store=True cuando necesites que el campo sea buscable, filtrable o exportable.
  • Declara siempre todas las dependencias en @api.depends(), incluidas las rutas entre modelos.
  • Optimiza las funciones compute para que sean rápidas y contempla casos límite de forma explícita.
  • Para fórmulas sencillas Studio es ágil; para lógica compleja, desarrolla en Python.
  • Planea la recomputación inicial al desplegar en producción si las tablas son grandes.

Tanto si creas un módulo nuevo, amplías un modelo existente o exploras tipos de campo en Odoo por primera vez, entender los campos computados almacenados te dará control sobre la capa de datos, la lógica de negocio y el rendimiento del sistema.


¿Necesitas ayuda con tu implementación de Odoo?

Dasolo acompaña a empresas en la implementación, personalización y optimización de Odoo para múltiples procesos de negocio. Si necesitas añadir campos computados a tu modelo, generar informes basados en valores calculados o avanzar en desarrollo Odoo, nuestro equipo tiene la experiencia necesaria.


Contáctanos para comentar tu caso y definir la mejor solución para tu proyecto en Odoo.

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