如何使用onchange方法复制One2many字段并进行修改?

时间:2018-12-20 09:37:59

标签: python odoo odoo-10

我想我做了1000次,但是今天我却无法实现,并且有很多疑问。

目的

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

场景

我在mrp.bom模型中。它有一个名为bom_line_ids One2many 字段。它还有一个名为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,该错误总是出现,那么当前物料清单是否已存在并不重要或不。而且,如果我从bom_id字典中删除了default键,则新行将添加到源 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)]

结论

我认为我正在使这一过程变得更复杂,必须有一些更简单的解决方案...有人知道如何做到这一点吗?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用其他选项,例如在bom.line对象中添加“活动”字段。

这样,您可以禁用先前的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