Odoo 11: проблема при создании вычислительного поля в модели sale.order.line - PullRequest
0 голосов
/ 24 января 2019

Я хочу поместить bom_id каждого продукта в модель sale.order.line, чтобы сделать это, я использую вычисленное поле, чтобы получить идентификатор бомбы (mrp.bom). Мне это нужно для конкретной разработки, где цель состоит в том, чтобы показать потребленные материалы в соответствии с расчетом компании, прежде чем перейти к производству. Вот код:

bom_id = fields.Integer(
    string='Bom ID',
    compute='_get_bom_id'
)

@api.multi
def _get_bom_id(self):
    bom_obj = self.env['mrp.bom']
    for record in self:
        bom_obj_id = bom_obj.search([('product_id', '=', record.product_id.id)])
        if bom_obj_id:
            record.bom_id = bom_obj_id.id
        else:
            record.bom_id = 0

Проблема в том, что поле не создано в модели sale.order.line, но если я уберу аргумент вычисления, оно будет работать. Я уже обновил модуль, зарегистрировался в pgadmin, ... Я знаю, что проблема связана с кодом, но не знаю, где. Вы можете мне помочь? Спасибо

1 Ответ

0 голосов
/ 24 января 2019

Неправильный тип поля, которое вы создали, это должно быть Many2one вместо Integer :

bom_id = fields.Many2one(
    comodel_name='mrp.bom',
    string='Bom ID',
    compute='_get_bom_id'
)

Вы также забыли api.depends декоратор. В вашем случае значение следует пересчитывать каждый раз, когда изменяется поле product_id.

Кроме того, вычисляемое поле всегда имеет значение False перед выполнением его метода вычисления, поэтому, если в вашем методе вычисления рабочий процесс не присваивает значение полю, он по-прежнему имеет значение False, что означает, что строки похожи на record.bom_id = 0 или record.bom_id = False бесполезны.

@api.multi
@api.depends('product_id')
def _get_bom_id(self):
    bom_obj = self.env['mrp.bom']
    for record in self:
        bom_obj_id = bom_obj.search([('product_id', '=', record.product_id.id)])
        if bom_obj_id:
            record.bom_id = bom_obj_id.id
...