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)
关键修改点说明
One2many字段的命令格式:
Odoo要求One2many字段在创建/复制时使用三元组命令,(6, 0, [ids])表示用给定的新记录ID列表替换当前关联关系。这里我们先复制所有原employee_line记录,生成新的记录后获取它们的ID,再用该命令传递给新创建的主记录。避免直接传递原记录集:
你之前直接把self.employee_line赋值给default['employee_line'],这会导致Odoo无法正确解析——它期望的是命令格式而非原记录集,所以无法完成关联复制。检查
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
相关产品推荐
相关产品推荐

