Operaciones con recordsets - Suma de campos en relaciones múltiples
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
Apasionado de la programación, implementa Odoo para distintos tipos de negocios desde el año 2010. En Moldeo Interactive es Socio fundador y Programador; además de escribir en el Blog sobre distintos temas relacionados a los desarrollos que realiza.