【问题标题】:How to delete a record without immediate database effect如何在不立即影响数据库的情况下删除记录
【发布时间】:2019-05-31 12:54:33
【问题描述】:

precedent question 中,我正在寻找BaseModel.new 方法,其行为类似于ORM 中的create 方法,但无需在数据库中写入更改。

是否存在相同的方法,但行为类似于unlink?我想在onchange 调用中从我的记录集中删除一条记录。我不希望立即删除记录,但仅在用户按下Save 按钮时才删除。

非常感谢您!


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

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

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

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

【问题讨论】:

  • 只有当用户按下save时是什么意思?
  • 我的意思是当您编辑包含记录集的模型时,在页面的左上角,您可以编辑然后保存或丢弃。例如,如果我编辑一个模型,然后我按下列表的垃圾桶图标,然后单击 Discard 按钮,被删除的行重新出现(它没有在数据库中被删除)。
  • 我刚刚编辑了我的问题,是不是更清楚了?
  • 你的意思是当你编辑x_to_many field ?!!
  • AFAIK 在 Odoo 中没有这样的东西。但我不太明白你为什么需要这样的东西。你能详细说明你为什么需要这个吗?

标签: odoo odoo-12


【解决方案1】:

我在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 字段。

【讨论】:

  • 这就是我想要的,但是这个解决方案清空了我的列表,因为它在做假动作时丢失了所有其他 move_line_id。这就是为什么我要寻找类似于new 的东西(相当于= [(0, '_', {...})]
  • 有趣的问题mmm,我会尝试寻找另一个解决方案^^。
  • 你也有很多情况,如果记录不保存,记录就保存了。记录被编辑了?!!!很多
  • 是的,我知道 ^^ 非常感谢您的宝贵时间!
  • 您能否给我代码中的部分 wḧich 当我们单击trash 图标时被调用?我找不到它(我可能遗漏了一些微不足道的东西)。也许它会帮助我理解这是如何工作的?
猜你喜欢
  • 2011-09-06
  • 2023-03-15
  • 2017-12-02
  • 2020-01-14
  • 1970-01-01
  • 2020-02-09
  • 2014-08-04
  • 2019-10-02
  • 2020-10-05
相关资源
最近更新 更多