Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何复制onchange方法中的One2many字段并对其进行修改?_Python_Odoo_Odoo 10 - Fatal编程技术网

Python 如何复制onchange方法中的One2many字段并对其进行修改?

Python 如何复制onchange方法中的One2many字段并对其进行修改?,python,odoo,odoo-10,Python,Odoo,Odoo 10,我想我已经做了上千次了,但今天我没能做到,我有很多疑问 目的 我需要将One2many字段的记录复制到One2many字段,但要更改列的值。此操作必须在onchange方法中执行 场景 我在模型mrp.bom中。它有一个名为bom\u line\u id的One2many字段。它还有一个名为product\u id的manyOne字段 每次product\u id更改时,我必须自动填写当前物料清单记录的bom\u line\u id,从其他物料清单的bom\u line\u id字段中获取数据。

我想我已经做了上千次了,但今天我没能做到,我有很多疑问

目的

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

场景

我在模型
mrp.bom
中。它有一个名为
bom\u line\u id
的One2many字段。它还有一个名为
product\u id
的manyOne字段

每次
product\u id
更改时,我必须自动填写当前物料清单记录的
bom\u line\u id
,从其他物料清单的
bom\u line\u id
字段中获取数据。但这些记录将不完全相同,我需要修改一列

示例

在onchange方法中,我需要将记录集
mrp.bom.line(10,11)
复制到我的One2many字段中,但在我的One2many字段中,两个记录的字段
line\u type
的值都是
'standard'
(源记录的
line\u type
值无关紧要)

我的尝试

我试了很多东西。最接近解决方案的尝试是这一次。但由于
\u origin
的原因,当前物料清单记录尚未保存在数据库中时,此操作将失败。错误说明
bom\u id
为空且为必填项。。。问题是,如果我不编写
\u origin
,错误总是会出现,当前物料清单是否已经存在并不重要。如果我从
default
字典中删除
bom\u 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对象中添加“活动”字段

这样,您就可以禁用以前的bom表行,并在onchange方法中添加新的bom表行,而不会干扰任何其他流程

附言:我没有试过

编辑:

浏览行并准备一个列表
(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

嗨,Odedra,我不想禁用以前的BoM行(我猜以前的行是指源行),因为它们必须存在并且可见。我只想将这些行复制到One2many字段,然后(或同时)修改每个复制记录中的字段值。源行必须与旧数据保持可见,新行必须是字段值已更改的行的副本,但所有行都必须处于活动状态。啊。知道了。不使用copy()方法并使用
(0,0,{values})
格式更新one2many字段怎么样。现在,您可以根据需要更新值。我想这些可以解决您的问题。好吧,我会试试,但是,您如何填写
(因为它必须是一个字典,源行的所有字段都是键,它们的所有值(除了一个)都是键值)。您会使用
search\u read
方法进行此操作还是其他操作?我的意思是,您必须将源行(一个
mrp.bom.line
对象)转换为一个字典,然后更新该字典(以修改我要更改的字段),然后执行
(0,0,values\u dict)
操作。您将如何进行转换?最后我完成了转换,我将编辑您的答案以显示代码,但您的想法可行。