Operaciones con recordsets - Suma de campos en relaciones múltiples

Gustavo Orrillo
- 30/06/2022 - 1 min. de lectura

Algo que aprendí hoy, sobre como sumar los campos de un recordset. Supongamos que tenemos un formulario que contiene lineas. Y cada línea tiene una columna llamada monto. Sería esta estructura:

class Formulario(models.Model):
    _name = 'formulario'
    _description = 'formulario'
    lineas = fields.One2many(comodel_name='formulario.line',inverse_name='formulario_id')
class FormularioLine(models.Model):
    _name = 'formulario.line'
    _description = 'formulario.line'     formulario = fields.Many2one('formulario')     amount = fields.Float('Monto')     cancelado = fields.Boolean('Cancelado')

Y lo que queremos hacer es agregar al modelo formulario un campo llamado saldo que sea la suma de todas las lineas relacionadas. Por lo general se lo hacía de la siguiente manera. Se definía un campo computado y en el método del cómputo, se iteraba sobre cada una de las líneas:

saldo = fields.Float('Saldo',compute="_compute_saldo"

def _compute_saldo(self): for rec in self: res = 0 res = res + rec.amount rec.saldo = res

Unas cuantas líneas, pero no imposible. Ahora, utilizando las funciones de recordsets del ORM de Odoo, lo reducimos a lo siguiente:

saldo = fields.Float('Saldo',compute="_compute_saldo"

def _compute_saldo(self):
    for rec in self:         rec.saldo = sum(self.lineas.mappend('amount'))

Y si queremos filtrar aquellas líneas que no fueron canceladas

saldo = fields.Float('Saldo',compute="_compute_saldo"

def _compute_saldo(self):
    for rec in self:         rec.saldo = sum(self.lineas.filtered(lambda l: not l.cancelado).mappend('amount'))

 Una belleza, no?

    

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.