如何在调用虚拟记录的onchange方法时修改上下文?

How to modify context when calling onchange methods of virtual records?

我正在创建一个虚拟记录,以便将几个 onchange 方法的结果应用于它。问题是对于其中一种方法,我需要传递特定的上下文,但这会导致丢失虚拟记录数据。

这是我正在调用的 onchange 方法:

@api.multi
@api.onchange('product_id')
def onchange_product_id_valued(self):
    _logger.critical('PRODUCT INSIDE ONCHANGE')
    _logger.critical(self.product_id)

以下几行工作正常,我可以创建股票变动的虚拟记录,并且记录器打印产品正常:

virtual_move = self.env['stock.move'].new({
    ...
    'product_id': product.id,
    ...
})
virtual_move.onchange_product_id_valued()

但是,以下几行不起作用。当我使用 with_context 设置特定上下文时,虚拟移动属性在 onchange 方法中都是空的,因此记录器打印了一个空记录集 product.product:

virtual_move2 = self.env['stock.move'].new({
    ...
    'product_id': product.id,
    ...
})
virtual_move2.with_context(
    partner_id=xxx,
    picking_type_id=yyy,
    date=zzz,
    pricelist_id=aaa,
    fiscal_position=bbb,
).onchange_product_id_valued()

为什么会发生这种情况,如何在不破坏虚拟记录数据的情况下将特定上下文发送到 onchange_product_id_valued 方法?

如果有人想知道如何解决这个问题,解决方案是在执行 new() 方法之前应用特定上下文:

self = self.with_context(
    partner_id=xxx,
    picking_type_id=yyy,
    date=zzz,
    pricelist_id=aaa,
    fiscal_position=bbb,
)
virtual_move2 = self.env['stock.move'].new({
    ...
    'product_id': product.id,
    ...
})
virtual_move2.onchange_product_id_valued()