Python 3 continue 循环语句是 Odoo 13 计算方法中的问题吗?

Is Python 3 continue loop statement a problem in compute methods in Odoo 13?

我正在将一个模块迁移到版本 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 语句上,如果我删除它,它就会起作用。我尝试在标准 Odoo 模块的其他计算方法的几个循环中使用 continue,结果相同。

到目前为止,如果您没有在计算方法中为字段赋值,它会自动取 False,因此 continue 不是问题。

有人在使用 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,
        })

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

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)。 您需要为在该方法中计算的每个计算字段设置一个值。