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)
。
您需要为在该方法中计算的每个计算字段设置一个值。
我正在将一个模块迁移到版本 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)
。
您需要为在该方法中计算的每个计算字段设置一个值。