编码
我有以下瞬态模型:
class MoveLotsManager(models.TransientModel): _name = 'move.lots.manager' product_lots_available = fields.One2many( comodel_name='move.product.lot.available', inverse_name='manager_id', string='Available lots', ) class MoveProductLotAvailable(models.TransientModel): _name = 'move.product.lot.available' manager_id = fields.Many2one( comodel_name='move.lots.manager', string='Lots Manager', ) name = fields.Char( string='Name', ) @api.one @api.onchange('name') def onchange_name(self): # LOGGER 4 _logger.info(self.manager_id) # LOGGER 5 _logger.info(self.manager_id.id)
如您所见,它们都是通过1:N关系连接的。我以这种方式打开瞬态模型的视图:
@api.multi def open_move_lots_manager_wizard(self): self.ensure_one() wizard_id = self.env.ref( 'my_module.view_move_lots_manager_wizard').id default_lots = [( (0, 0, { 'name': 'My lot', }) )] lots_manager = self.env['move.lots.manager'].create({ 'product_lots_available': default_lots, }) # LOGGER 1 _logger.info(lots_manager) # LOGGER 2 _logger.info(lots_manager.id) # LOGGER 3 _logger.info(lots_manager.product_lots_available.mapped('manager_id')) return { 'name': _('Lots manager'), 'view_type': 'form', 'view_mode': 'form', 'view_id': False, 'res_id': lots_manager.id, 'views': [(wizard_id, 'form'), ], 'res_model': 'move.lots.manager', 'type': 'ir.actions.act_window', 'target': 'new', 'flags': { 'form': { 'action_buttons': False, }, }, }
我的目的
在onchange_name模型的方法中move.product.lot.available,我想访问其相关的管理器(及其字段)。
onchange_name
move.product.lot.available
预期的行为
假设move.lots.manager我刚刚创建的ID为11。
move.lots.manager
LOGGER 1: move.lots.manager(11,) LOGGER 2: 11 LOGGER 3: move.lots.manager(11,) LOGGER 4: move.lots.manager(11,) LOGGER 5: 11
当前行为
LOGGER 1: move.lots.manager(11,) LOGGER 2: 11 LOGGER 3: move.lots.manager(11,) LOGGER 4: move.lots.manager(<openerp.models.NewId object at 0x7fd1a60cb850>,) LOGGER 5: <openerp.models.NewId object at 0x7fd1a60cb850>
我的问题
我知道瞬态模型不是永久存储的,而是根据数据库的系统参数在一段时间后被删除的。但是,当它们在数据库中时,它们确实具有ID。实际上,当我打开瞬态模型表单(激活了开发人员模式)并单击“ 查看元数据” 选项时,我可以看到 ID:11 …为什么我不可以得到它呢?从“子”瞬态模型得到它?
看一下onchange()行4971及以下代码。Odoo正在缓存/内存中创建一个新记录,稍后将在完成onchange之后,使用提供的数据更新自己的缓存。
如果您确实需要ID或其他字段,请使用<record>._origin.<field>。
<record>._origin.<field>
编辑:不要api.one在onchange方法上使用装饰器。无论如何,它们都是在单例记录上触发的。
api.one