Специальный сценарий сопоставления фильтра и метода расчета - 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, и многие могут перемещать акции.