我想我做了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)]
结论
我认为我正在使这一过程变得更复杂,必须有一些更简单的解决方案...有人知道如何做到这一点吗?
答案 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