You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 10复制功能无法复制One2many关联字段问题求助

解决Odoo 10中复制条目时One2many字段未复制的问题

你遇到的问题核心是重写copy方法时,没有正确处理One2many字段的赋值格式。Odoo的关联字段(尤其是One2many/Many2many)需要使用特殊的命令语法来传递数据,而不是直接传递原记录集。

修改后的copy方法代码

import logging
_logger = logging.getLogger(__name__)

@api.multi
def copy(self, default=None):
    default = dict(default or {})
    # 清空引用字段,避免触发唯一约束报错
    default['referencia'] = ''
    
    # 处理One2many字段:复制所有关联的employee_line记录
    if self.employee_line:
        # 先复制每条关联记录,获取新记录的ID列表
        # 注意:如果employee_line模型自身有字段设置了copy=False,需单独处理
        copied_lines = self.employee_line.copy()
        default['employee_line'] = [(6, 0, copied_lines.ids)]
    
    _logger.info("DEBUG: 处理后的default参数: %s", str(default))
    return super(EmpleadosProductos, self).copy(default)

关键修改点说明

  1. One2many字段的命令格式:
    Odoo要求One2many字段在创建/复制时使用三元组命令,(6, 0, [ids])表示用给定的新记录ID列表替换当前关联关系。这里我们先复制所有原employee_line记录,生成新的记录后获取它们的ID,再用该命令传递给新创建的主记录。

  2. 避免直接传递原记录集:
    你之前直接把self.employee_line赋值给default['employee_line'],这会导致Odoo无法正确解析——它期望的是命令格式而非原记录集,所以无法完成关联复制。

  3. 检查employee_line模型的复制行为:
    如果employee.line模型中有字段设置了copy=False,这些字段在复制时不会被保留。你需要确保该模型的字段(比如关联的其他子字段)没有禁用复制,或者在它的copy方法中手动处理这些字段的复制逻辑。

额外提示

如果你的employee.line模型不需要自定义复制逻辑,也可以尝试直接在EmpleadosProductos的employee_line字段定义中显式设置copy=True(默认One2many字段的copy属性为True,但有时会因其他配置失效):

employee_line = fields.One2many(
    'employee.line', 'order_id', string='Employee Lines', copy=True
)

不过这种方式依赖Odoo的默认复制逻辑,灵活性不如手动重写copy方法。

内容的提问来源于stack exchange,提问作者Carlos Troyano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:18:52