当前位置: 首页 > 面试题库 >

这些瞬态模型的ID发生了什么?

张鸿志
2023-03-14
问题内容

编码

我有以下瞬态模型:

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,我想访问其相关的管理器(及其字段)。

预期的行为

假设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。实际上,当我打开瞬态模型表单(激活了开发人员模式)并单击“
查看元数据” 选项时,我可以看到 ID:11 …为什么我不可以得到它呢?从“子”瞬态模型得到它?


问题答案:

看一下onchange()行4971及以下代码。Odoo正在缓存/内存中创建一个新记录,稍后将在完成onchange之后,使用提供的数据更新自己的缓存。

如果您确实需要ID或其他字段,请使用<record>._origin.<field>

编辑:不要api.one在onchange方法上使用装饰器。无论如何,它们都是在单例记录上触发的。



 类似资料:
  • 我正试着用Spring Boot和Hibernate做一个简单的登录应用程序,不同的是我用JSP代替了百里香。 虽然注册已成功进行,但在使用注册的电子邮件ID登录时,我收到瞬态DataAccessResourceException。 我对这篇文章的理解是,“spring.queries.users-query”属性(来自application.properties)需要1个参数(正如它应该的那样)

  • 问题内容: 早期的javadoc 这样表示有一个接口,它似乎有一个同样的关系作为必须的。 现在看来,我们固守在,这肯定是不一样的。 发生了什么事? 问题答案: 它已被删除前一段时间。布赖恩·格茨(Brian Goetz)提出了撤职的理由: 当前,唯一的实现者是Collection,所有其他支持流的方法都使用一种比“ stream”更合适的方法名称来提供特殊的流(chars(),codePoints

  • 我刚刚浏览了一些关于如何在另一个像素阵列之上绘制像素阵列的代码,如下所示: } 如您所见,一个人能够在另一个位图之上的特定坐标上绘制一个位图对象。 我不明白的是两个for循环。我知道,外部for循环是绘制位图的y轴,并启动内部for循环来绘制位图的x轴。 现在我过来了: sp和dp到底代表什么?'c'在后面是什么意思 ? 提前感谢,致以最诚挚的问候

  • 我写了一个函数: 我想的是用一个“cur”来记录这两个链表“a”和“b”中的每个节点。然后这两个链表'a'和'b'移动到它的下一个节点。然后转到下一个WHILE循环。 然而,这是错误的。当我调试时,在这个第一个WHILE循环中,当它完成这个

  • 问题内容: 主要问题: 我用两种不同的方式定义相同的模型。为什么会得到不同的结果?它们似乎是相同的模型。 第二个问题(在下面回答)如果再次运行代码,则会再次得到不同的结果。我已经在开始时设置了种子以修复随机性。为什么会这样呢? 第一次,输出为: 第二次,输出为: 阅读答案后更新: 通过以下答案,我的问题之一已得到解答。我将代码的开头更改为: 而且,现在我得到的数字与以前相同。因此,它是稳定的。但是