如何在没有立即数据库影响的情况下删除记录

How to delete a record without immediate database effect

中,我一直在寻找 BaseModel.new 方法,其行为类似于 ORM 中的 create 方法,但不在数据库中写入更改。

是否存在相同的方法,但表现得像 unlink?我想在 onchange 调用中从我的记录集中删除一条记录。我不想立即删除记录,但只有在用户按下 Save 按钮时才删除。

非常感谢您!


有关我为什么需要此功能的更多信息:

我正在使用 Odoo 的 stock 模块。在 Picking 中,我想动态更改保留的产品(通过唯一序列号跟踪),这意味着添加一些新的 move_line 并删除一些现有的。

我不能简单地更改 lot_id,因为某些带有此 lot_idmove_line 可能保留在另一个 Picking 中(或者至少,我没有找到如何巧妙地做到这一点)。

通过在我的 onchange 方法中更改 lot_id 或执行 selected_move_id.move_line_ids.new({...}),我可以添加新的。现在我想删除我不再需要的现有的。我想删除它们的方式就像用户按下相应行上的 trash 图标一样。

我在 Odoo 12 中尝试过类似的东西,效果很好:

# I change the partner for testing different cases
@api.onchange('partner_id')
def onchage_p(self):
    """ remove moves have less then 5 units"""
    # create empty record set to hold valid records
    new_recs = self.env['stock.move']
    for move in self.move_ids_without_package:
        # keep only record that greater than 5
        if move.product_uom_qty > 5:
            new_recs += move

    # reassign it to the field. 
    self.move_ids_without_package = new_recs

当我在 stock.picking 上调试 write 调用时 delete cammand 所有保存的动作都通过了:[...,[2, move_id, False]]

框架能够检测到一条记录已从原始 recordset 中删除,这就是添加该命令的原因。

所以基本的想法是创建一个新的 recordset,其中包含有效的记录,再次将其分配给 one2many 字段。