Получить сумму других полей модели по условию

Я хочу, чтобы сумма общего поля ru.invoice отображалась на ru.students, если поле имени ru.students равно student_id из ru.invoice.

Я использовал метод browse, но он не работает.

class ru_students(models.Model):
    _name = 'ru.students'
    _rec_name = 'code'

def _get_total(self, cr, uid, ids, context=None):
    pool_re = self.pool.get('ru.invoice')
    pool_rec = pool_re.browse(cr, uid, ids, [('name','=','student_id')],    
context=context)
    for field in self:
        for line in pool_rec:
            x = 0.0
            x += line.total
            field.payed += x

    name = fields.Char(string="Name")
    payed = fields.Float(compute="_get_total")


   class ru_invoice(models.Model):
       _name = 'ru.invoice'
       _rec_name = 'code'

    @api.multi
    @api.depends('qty','unit_price')
    def get_total(self):
        for rec in self:
            x = 0.0
            x = rec.qty * rec.unit_price
            rec.total = x


student_id = fields.Many2one('ru.students','Student ID")
qty = fields.Float(string="Quantity")
unit_price = fields.Float(string="Unit Price")
total = fields.Float(compute="_get_totals",string="Total")

person Omeed Totakhel    schedule 06.08.2015    source источник
comment
Можете ли вы быть более конкретным, чем это не сработало? Вы получили исключение? Получили ли вы результат, отличный от ожидаемого? См. stackoverflow.com/help/how-to-ask.   -  person das-g    schedule 07.08.2015


Ответы (1)


Прежде всего, будьте осторожны, не смешивайте код API7 с кодом API8, всегда используйте код API8, если можете (кроме того, вам будет намного проще использовать API8). Я думаю, вы хотите, чтобы это было в вашем поле payed (проверьте также класс ru_invoice, потому что я исправил там некоторые вещи -пример: в поле total вы написали _get_totals в compute, когда хотели вызвать _get_total-).

class ru_students(models.Model):
    _name = 'ru.students'
    _rec_name = 'code'

    @api.multi
    @api.depends('invoices')
    def _get_total(self):
        for student in self:
            student.payed = sum(
                invoice.total for invoice in student.invoices)

    name = fields.Char(string='Name')
    payed = fields.Float(compute='_get_total', string='Payed')
    invoices = fields.One2many(comodel_name='ru.invoice',
                               inverse_name='student_id',
                               string='Invoices of the student')


class ru_invoice(models.Model):
    _name = 'ru.invoice'
    _rec_name = 'code'

    @api.multi
    @api.depends('qty', 'unit_price')
    def _get_total(self):
        for invoice in self:
            invoice.total = invoice.qty * invoice.unit_price

    student_id = fields.Many2one(comodel_name='ru.students',
                                 string='Student ID')
    qty = fields.Float(string='Quantity')
    unit_price = fields.Float(string='Unit Price')
    total = fields.Float(compute='_get_total', string='Total')
person forvas    schedule 07.08.2015
comment
Спасибо, сработало, я пытался вычислить его, не добавляя поле one2many. - person Omeed Totakhel; 07.08.2015
comment
Каждый раз, когда вы создаете поле Many2one, вы должны создавать поле One2many в обратной таблице (хотя иногда это и не требуется). Я рад, что смог вам помочь! - person forvas; 07.08.2015
comment
это должно быть get_total или _get_total? - person pourjour; 11.08.2016
comment
@pourjour это должно быть _get_total. - person forvas; 11.08.2016