如何在 onchange 方法中复制一个 One2many 字段并修改它?

How to copy an One2many field in an onchange method and modify it?

我想我已经做了一千次了,但是今天我做不到,有很多疑问。

目的

我需要将 One2many 字段的记录复制到我的 One2many 字段,但要更改列的值。此操作必须在 onchange 方法中执行。

场景

我在模特中mrp.bom。它有一个名为 bom_line_idsOne2many 字段。它还具有名为 product_id.

Many2one 字段

每次product_id变化,我都要自动填写当前物料单记录的bom_line_ids,取其他物料单bom_line_ids字段的数据.但是这些记录不会完全一样,我需要修改一列。

示例

onchange 方法中,我需要将记录集 mrp.bom.line(10, 11) 复制到我的 One2many 字段,但在我的 One2many 字段两条记录都将具有字段 line_type 和值 'standard'(源记录的 line_type 值无关紧要)。

我的尝试

我尝试了很多东西。最接近解决方案的尝试是这个。但是,由于 _origin,当当前物料清单记录尚未保存在数据库中时,此操作失败。错误说 bom_id 是 NULL 并且它是强制性的......问题是如果我不写 _origin,这个错误总是出现,如果当前的物料清单已经存在并不重要或不。如果我从 default 字典中删除 bom_id 键,新行将添加到源 One2many 而不是我的...

@api.onchange('product_id')
def onchange_product_id(self):
    if self.product_id and \
       self.product_id.product_tmpl_id.bom_ids:
        # Following lines are only for taking the source BoM
        bom_ids = self.product_id.product_tmpl_id.bom_ids.filtered(
            lambda r: not r.product_id)
        bom_id = bom_ids[0] if bom_ids else False
        # Following lines are for doing the copy
        new_lines = self.env['mrp.bom.line']
        for line in bom_id.bom_line_ids:
            new_lines += line.copy(default={
                'bom_id': self._origin.id,
                'line_type': 'standard',
            })
        self.bom_line_ids = [(6, 0, new_lines.ids)]

结论

我想我把它弄得比现在更复杂了,一定有一些更简单的解决方案...有人知道怎么做吗?

您可以尝试其他选项,例如在 bom.line 对象中添加 "active" 字段。

有了它,您可以禁用之前的 bom 行并在 onchange 方法中添加新的 bom 行,而不会干扰任何其他流程。

PS: 没试过

编辑:

浏览行并准备列表(0, 0, { values })以更新 one2many 字段。

@api.onchange('product_id')
def onchange_product_id(self):
    if self.product_id and \
       self.product_id.product_tmpl_id.bom_ids:
        bom_ids = self.product_id.product_tmpl_id.bom_ids.filtered(
            lambda r: not r.product_id)
        bom_id = bom_ids[0] if bom_ids else False
        new_lines = []
        for line in bom_id.bom_line_ids:
            vals = line.read()[0]
            vals.update({
                'line_type': 'standard',
            })
            vals.pop('bom_id', False)
            new_lines.append((0, 0, vals))
        self.bom_line_ids = new_lines