如何创建记录而不将其保存在数据库中

时间:2019-05-11 16:30:56

标签: odoo recordset odoo-12

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

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

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

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

有没有设法做到这一点的人?

提前谢谢!
很抱歉,如果它是重复的问题,但是我还没有找到我问题的答案> << / p>


jzeta的答案有效,但中断了其他Move字段,例如reserved_availability(总是0)或quantity_done(总是1)。


我将jzeta验证为有效,因为评论表明我正在寻找解决方案。

非常感谢你们的帮助!

2 个答案:

答案 0 :(得分:2)

我相信您可以通过将值直接分配给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})]

答案 1 :(得分:-2)

.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.