这些瞬态模型的 ID 发生了什么?
What's happening with these transient models' IDs?
代码
我有以下瞬态模型:
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,
},
},
}
我的目的
在模型 move.product.lot.available
的 onchange_name
方法中,我想访问它的相关管理器(及其字段)。
预期行为
假设我刚刚创建的 move.lots.manager
ID 为 11。
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。正如您所见,我可以得到它,事实上,当我打开瞬态模型表单(激活开发人员模式)并单击 View Metadata 选项时,我可以看到 ID: 11...那么为什么我不能从"child"瞬态模型中得到它?
看看 onchange() line 4971 and following。 Odoo 正在 cache/memory 中创建一条新记录,稍后会在 onchange 完成后,使用提供的数据更新自己的缓存。
如果您确实需要 ID 或其他字段,请使用 <record>._origin.<field>
。
编辑:不要在 onchange 方法上使用 api.one
装饰器。无论如何,它们都是在单例记录上触发的。
代码
我有以下瞬态模型:
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,
},
},
}
我的目的
在模型 move.product.lot.available
的 onchange_name
方法中,我想访问它的相关管理器(及其字段)。
预期行为
假设我刚刚创建的 move.lots.manager
ID 为 11。
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。正如您所见,我可以得到它,事实上,当我打开瞬态模型表单(激活开发人员模式)并单击 View Metadata 选项时,我可以看到 ID: 11...那么为什么我不能从"child"瞬态模型中得到它?
看看 onchange() line 4971 and following。 Odoo 正在 cache/memory 中创建一条新记录,稍后会在 onchange 完成后,使用提供的数据更新自己的缓存。
如果您确实需要 ID 或其他字段,请使用 <record>._origin.<field>
。
编辑:不要在 onchange 方法上使用 api.one
装饰器。无论如何,它们都是在单例记录上触发的。