如何在不将记录保存到数据库的情况下创建记录

How to create a record without saving it in database

我正在使用 Odoo 12 的 Inventory 插件(但我的问题可能发生在任何模块上)。

在此插件中,StockMove 模型有一个 move_line_ids 字段。
Detailed Operations 对话框中,我们可以看到所选着法的所有着法线的树视图。

如果我们单击 Add a line 按钮并设置字段,值将存储在内存中,但不会存储在数据库中,除非我们单击 Confirm 按钮。

我想在自定义 StockMove 模型的 @api.onchange() 方法中复制此行为,但我不知道如何继续。
如果我使用 self.move_line_ids.create() 方法创建我的新记录,即使我不单击 Confirm 按钮,移动行也会存储在数据库中。

有人成功做到了吗?

提前致谢!
抱歉,如果这是一个重复的问题,但我还没有找到问题的答案 ><


答案有效,但会破坏其他 Move 字段,例如 reserved_availability(始终 0)或 quantity_done(始终 1 ).


我保持 有效,因为评论显示了我正在寻找的解决方案。

非常感谢你们的帮助!

.create 方法在数据库中创建一条记录,所以它应该这样做, 如果我理解你的话,我认为你应该使用 TransientModelAbstractModel 之类的东西?!

An Abstract model is created by a class based on models.AbstractModel instead of
the usual models.Model. It has all the attributes and capabilities of regular models; the
difference is that the ORM will not create an actual representation for it in the database. So,
it can have no data stored in it. It serves only as a template for a reusable feature that is to be
added to regular models.

相信直接给move_line_ids赋值就可以实现。当然,如果字段是 One2many,则需要使用特殊的三元组列表来实现。在你的例子中,你需要一个 [(0, _, values)] 来创建一个新记录(其中 values 是保存每个新记录字段值的字典)。在下面的示例中,我只创建了一个附加到给定 stock.move 实例的记录,并且我只传递了字典中的 move_id 值。您应该使用新移动行的适当值来完成代码,但请注意,您应该始终告诉新记录它链接到哪个股票移动。

@api.onchange('your_field_name')
def _onchange_field(self):
    self.move_line_ids = [(0, False, {'move_id': self.id})]