如何在 onchange 方法中复制一个 One2many 字段并修改它?
How to copy an One2many field in an onchange method and modify it?
我想我已经做了一千次了,但是今天我做不到,有很多疑问。
目的
我需要将 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
,这个错误总是出现,如果当前的物料清单已经存在并不重要或不。如果我从 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
我想我已经做了一千次了,但是今天我做不到,有很多疑问。
目的
我需要将 One2many 字段的记录复制到我的 One2many 字段,但要更改列的值。此操作必须在 onchange 方法中执行。
场景
我在模特中mrp.bom
。它有一个名为 bom_line_ids
的 One2many 字段。它还具有名为 product_id
.
每次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