为什么无法从Odoo8中的TransientModel访问计算字段?

时间:2016-09-21 08:52:53

标签: python-2.7 openerp odoo-8

环境

我创建了两个TransientModel(名为lots.managerproduct.lot.available),它们之间存在One2many关系(很多经理会有几个可用的批次)。

我的目的是显示可用批次的列表,用户将能够选择他想要使用的批次以及每个批次的数量。因此,product.lot.available包含字段lot_id(选择一个批次),selected(一个Boolean表示是否使用该批次),qty (a Float表示每批次使用的数量。)

另一方面,在lots.manager模型中,我有一个名为total_qty_selected的计算字段,用于计算qty所有可用批次的selected的总和字段 True

CODE

class LotsManager(models.TransientModel):
    _name = 'lots.manager'

    @api.multi
    @api.depends('product_lots_available', 'product_lots_available.selected',
                 'product_lots_available.qty')
    def _compute_total_qty_selected(self):
        for manager in self:
            total = 0
            for lot in manager.product_lots_available:
                if lot.selected is True:
                    total += lot.qty
            manager.total_qty_selected = total

    move_id = fields.Many2one(
        comodel_name='stock.move',
        string='Stock move',
        required=True,
        select=True,
        readonly=True,
    )
    product_id = fields.Many2one(
        comodel_name='product.product',
        related='move_id.product_id',
        string='Product',
    )
    product_lots_available = fields.One2many(
        comodel_name='product.lot.available',
        inverse_name='manager_id',
        string='Available lots',
    )
    total_qty_selected = fields.Float(
        compute='_compute_total_qty_selected',
        string='Total quantity selected',
    )


class ProductLotAvailable(models.TransientModel):
    _name = 'product.lot.available'

    manager_id = fields.Many2one(
        comodel_name='lots.manager',
        string='Lots Manager',
    )
    lot_id = fields.Many2one(
        comodel_name='stock.production.lot',
        string='Lot',
        readonly=True,
    )
    selected = fields.Boolean(
        string='Selected',
        default=False,
    )
    qty = fields.Float(
        string='Quantity',
        default=0.00,
    )

    @api.onchange('selected')
    def onchange_selected(self):
        if self.selected is True:
            _logger.info(self.manager_id.product_id.name)
            _logger.info(self.manager_id.total_qty_selected)

问题

计算后的字段total_qty_selected计算得很好(我在视图中显示它并且效果很好)但是,当我尝试从product.lot.available读取它时,我总是得到0.例如,{上面的_logger函数中的{1}}行显示了产品的名称,但onchange返回0,而不是在那一刻我可以在表单中读取2.00或任何值与0不同。

我需要在onchange函数中做一些正确的值。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

在计算字段中使用store=True。请尝试下面的代码

class LotsManager(models.TransientModel):
_name = 'lots.manager'

   total_qty_selected = fields.Float(
    compute='_compute_total_qty_selected',
    string='Total quantity selected', store=True
)

答案 1 :(得分:0)

最后,我设法用一种可怕的解决方法解决了这个问题。但它运作良好。

我将以下字段添加到lots.manager模型中:

total_qty_selected_copy = fields.Float(
    string='Total quantity selected (copy)',
    default=False,
)

每次原始字段都会更改此字段,添加以下代码:

@api.one
@api.onchange('total_qty_selected')
def onchange_selected(self):
    self.total_qty_selected_copy = self.total_qty_selected

显然,我必须将total_qty_selected_copy添加到XML视图中,并使其不可见。

经过这些修改后,我可以通过这个新字段从product.lot.available模型获得我需要的值:

@api.onchange('selected')
def onchange_selected(self):
    if self.selected is True:
        _logger.info(self.manager_id.product_id.name)
        _logger.info(self.manager_id.total_qty_selected_copy)