2

我正在将一个模块迁移到版本 13.0,它continue在计算方法内的循环中使用,一个错误让我发疯了一段时间。

我将代码简化到最低限度,直到我有这种废话:

@api.depends('move_lines', 'move_lines.price_subtotal')
def _compute_subtotal(self):
    for picking in self:
        if picking.picking_type_id.code not in ['incoming', 'outgoing']:
            continue
        picking.update({
            'amount_untaxed': 3.0,
        })

但是我仍然收到错误,顺便说一下(并且仅在创建新选择时显示):

stock.picking(<NewId 0x7f5404ba5eb8>,).amount_untaxed

所以我意识到问题出在continue声明上,如果我删除它,它就起作用了。我尝试continue在标准 Odoo 模块的其他计算方法的几个循环中使用,结果相同。

到目前为止,如果您没有为计算方法中的字段分配值,它会自动取False,所以continue不是问题。

有没有人也遇到过这个问题continue

4

2 回答 2

3

需要为每个记录集设置值。如果我们使用 continue 并且不为该特定记录集设置值,则会出现您提到的问题。

尝试使用以下代码:

@api.depends('move_lines', 'move_lines.price_subtotal')
def _compute_subtotal(self):
    for picking in self:
        amount_untaxed = 0.0
        if picking.picking_type_id.code == 'internal':
            amount_untaxed = 3.0
        picking.update({
            'amount_untaxed': amount_untaxed,
        })

如果我们执行以下代码,Continue 将起作用:

@api.depends('move_lines', 'move_lines.price_subtotal')
def _compute_subtotal(self):
    for picking in self:
        picking.update({
            'amount_untaxed': 0.0,
        })
        if picking.picking_type_id.code not in ['incoming', 'outgoing']:
            continue
        picking.update({
            'amount_untaxed': 3.0,
        })
于 2020-02-18T16:23:08.003 回答
2

问题不在于 continue 语句本身,而是 Odoo 期望您为计算字段设置值,因为如果您检查类的__get__代码Field

def __get__(self):
     ....
     .....
        elif self.compute:
            ........
            ........
            else:
                recs = record if self.recursive or not record.id else record._in_cache_without(self)
                try:
                    # Here it's computing the value for this record
                    self.compute_value(recs)
                except AccessError:
                    self.compute_value(record)
                # after computation they try the get the value from the environment cache
                value = env.cache.get(record, self)

而且因为你没有设置这条记录的值,这会引发这个错误odoo.exceptions.CacheMiss: ('stock.picking(ID_OF_RECORD,).amount_untaxed', None)。您需要为在该方法中计算的每个计算字段设置一个值。

于 2020-02-18T20:11:12.287 回答