Campos computados - Porque usarlos

Gustavo Orrillo
- 07/05/2022 - 1 min. de lectura

Sobre los motivos para usar campos computados, creo que el principal motivo para tenerlos es porque es más facil mantenerlos. Más cuando estamos hablando de los campos computados almacenados (que se definen con el atributo store=True. Por ejemplo, supongamos que creamos el campo amount_invoiced en el modelo sale.order.line (líneas de pedidos de venta)

amount_invoiced = fields.Float('Monto facturado',store=True,compute="_compute_amount_invoiced")

La idea de este campo es, tener el monto facturado de una línea de un pedido de ventas. Si no usasemos un campo computado, cada vez que se crea una línea de factura relacionada con el pedido de venta, o se modifica la linea de factura relacionada con el pedido; debería actualizarse el valor del campo. Lo cual se lo puede hacer, pero tiene un costo de mantenimiento.

Ahora supongamos que lo hacemos como campo computado, solo debería hacerse de la siguiente manera:

@api.depends('invoice_lines')
def _compute_amount_invoiced(self):
    for rec in self:
        res = 0
        for inv_line in rec.invoice_lines:
            tax_amount = inv_line.tax_ids[0].amount / 100
            res = res + inv_line.price_subtotal * (1 + tax_amount)
        rec.amount_invoiced = res

Primero hacemos el campo computado almacenado porque vamos a necesitar hacer búsquedas por dicha columna y además voy a necesitar sumarlo en las vistas tipo tree o pivot. Luego, el campo depende del cambio en la columna invoice_lines que tiene la referencia a las múltiples líneas de factura relacionadas. Luego recorremos dichas líneas, y calculamos el total de las mismas (agregandole el impuesto).

Esta solución a nivel mantenimiento es menos costosa que hacer el mismo cambio cada vez que borramos, agregamos o modificamos una línea de factura relacionada. Es por lo menos un 50% más barato de mantener. Este es un buen motivo para usar campos computados.

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.