Специальный сценарий сопоставления фильтра и метода расчета - Odoo v8

Предположим, у меня есть поле с именем isbn на stock_moveэто поле имеет Boolean типа, я могу создать метод с фильтром домена, который принесет все stock_move объекты, с ('isbn', '=', 'True'),и отразите этот расчет в другом поле, например так:

@api.multi
@api.depends('stock_move')
def _compute_amount_total(self):
    draft_orders = self.env['stock.move'].search([('isbn', '=', True)])
    product_uom_qty = sum(draft_orders.mapped('product_uom_qty'))
    for record in self:
        record.total_isbn = product_uom_qty

Так что, безусловно, это хороший подход, но теперь, предположим, я хочу сделать это, но не для ВСЕХ stock_moves в котором isbn поле проверено, но только для stock_moves Я звоню, скажем, 4 Many2one поля в модели, то есть:

stock_move1 = fields.Many2one('stock.move', string="My Stock Move 1")
stock_move2 = fields.Many2one('stock.move', string="My Stock Move 2")
stock_move3 = fields.Many2one('stock.move', string="My Stock Move 3")
stock_move4 = fields.Many2one('stock.move', string="My Stock Move 4")

Я могу позвонить isbn поле на моей модели, как это, хотя:

stock_move1 = fields.Many2one('stock.move', string="My Stock Move 1")
isbn1 = fields.Boolean(string="ISBN 1", related="stock_move1.isbn")
stock_move2 = fields.Many2one('stock.move', string="My Stock Move 2")
isbn2 = fields.Boolean(string="ISBN 2", related="stock_move2.isbn")
stock_move3 = fields.Many2one('stock.move', string="My Stock Move 3")
isbn3 = fields.Boolean(string="ISBN 3", related="stock_move3.isbn")
stock_move4 = fields.Many2one('stock.move', string="My Stock Move 4")
isbn4 = fields.Boolean(string="ISBN 4", related="stock_move4.isbn")

Это должно привести их, но на самом деле я не хочу показывать их или что-либо на мой взгляд, просто прочитайте эти 4 stock_moves Ищу isbn = True и сумма product_uom_qty на них.

Я надеюсь, что я объяснил себе.

Любые идеи о том, как это может быть достигнуто?

2 ответа

Решение

Может быть, что-то вроде этого:

@api.multi
@api.depends(
    'stock_move1.isbn', 'stock_move1.product_uom_qty',
    'stock_move2.isbn', 'stock_move2.product_uom_qty',
    'stock_move3.isbn', 'stock_move3.product_uom_qty',
    'stock_move4.isbn', 'stock_move4.product_uom_qty')
def _compute_amount_total(self):
    for record in self:
        moves = (record.stock_move1 +
            record.stock_move2 +
            record.stock_move3 +
            record.stock_move4).filtered('isbn')
        record.total_isbn = sum(moves.mapped('product_uom_qty'))

Из того, что я понял из вашего описания, вы на самом деле не isbn1..4 связанные поля.

Я думаю, что @naglis jonailis ответил на ваш вопрос. Вы можете получить некоторые ошибки, потому что он не проверял значения пустыми или не конкатенировал поле напрямую.

                total_quantity = 0
                # check if the field is selected and add the quantity 
                if rec.many2one_field :
                      total_quantity =+ rec.many2one_field.product_uom_qty


                # affect the sum to your computed field
                 rec.compute_sum_field = total_quantity

И еще одна причина, по которой при использовании многих many2one можно использовать many2many, и многие могут перемещать акции.

Другие вопросы по тегам