【问题标题】:How to create a record without saving it in database如何创建记录而不将其保存在数据库中
【发布时间】:2019-09-29 05:28:59
【问题描述】:

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

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

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

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

有人能做到吗?

提前感谢您!
对不起,如果这是一个重复的问题,但我还没有找到我的问题的答案>


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


我将保持 jzeta 的有效性,因为 cmets 显示了我正在寻找的解决方案。

非常感谢你们的帮助!

【问题讨论】:

    标签: odoo recordset odoo-12


    【解决方案1】:

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

    【讨论】:

    • 如果我print(type(self.move_line_ids)),我得到<class 'odoo.api.stock.move.line'>。做任务好吗?如果我想添加而不是设置 move_line_ids 值怎么办? (对不起,我对那个 ORM 有困难......)
    • 好的,我测试过,它可以工作。我仍然不明白为什么尽管我们进行了分配,但类型没有改变,但是......好吧!非常感谢!
    • 实际上,它可以工作,但会破坏移动数量和保留数量。向导开始显示 0 / 3 个单位(例如),在我添加一个后,1 / 0 个单位,然后我再次添加,仍然是 1 / 0 个单位。
    • 我记得你可以使用new 方法,它的工作方式类似于create,只是它不会将记录保存在数据库中
    • 我想你通常使用new() 当你想调用一些onchange 方法来获取你在GUI上做工作时得到的那些缺失值。你去如下:cache_record = self.env['<model>'].new(values);然后调用你想调用的任何onchange 方法;然后最终从缓存对象中获取值字典:updated_values = cache_record._convert_to_write(cache_record._cache);最后在writecreate 方法上使用更新后的值。它也可以解决 OP 的问题。不过没试过。
    【解决方案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.
    

    【讨论】:

    • 不是真的,我想将它添加到数据库中,但是当单击Confirm 按钮时,对于每个具有普通模型的树视图。我只想在@api.onchange() 方法中复制Add a line 行为。我的意思是,当触发此 onchange 的事件发生时,我想在树视图中添加一个新行。
    • 不是 OP 要求的。通常,AbstractModel 用于混入,TransientModel 用于向导。 OP 正在询问如何在不调用 create 的情况下使用和 onchange 方法更新 O2m 字段。
    猜你喜欢
    • 2019-11-02
    • 2020-02-29
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多