跳至内容

Odoo 中实现 On2many 字段的复制详解

在 Odoo 开发过程中,经常会遇到需要复制模型记录的情况,而对于One2many字段,如何确保在复制主记录时,其关联的明细数据也能一并正确复制,是一个常见的需求点。

下面我将结合具体的代码示例,详细讲解如何实现这一功能。 

1. Odoo 字段定义

在 Odoo 模型中,我们通常会使用fields模块来定义各种字段。以一个简单的支付结果模型为例,假设我们有一个edoenginee_payresult模型,其中包含了一个状态字段state和一个One2many类型的字段fpayhz_ids,其定义如下:

from odoo import fields, models


class edoenginee_payresult(models.Model):

    _name = 'edoenginee_payresult'

    _description = '支付结果模型'


    state = fields.Selection([

        ('draft', '草稿'),

        ('done', '已审核'),

    ], string='状态', required=True, default='draft', tracking=True)


    fpayhz_ids = fields.One2many(

        comodel_name='fpayhz',  # 关联的子模型名称

        inverse_name='parent_id',  # 子模型中指向主模型的字段名

        string='支付汇总明细'

    )

上述代码中,state字段是一个选择字段,用于表示记录的状态;fpayhz_ids字段是One2many类型,它建立了edoenginee_payresult模型与另一个名为fpayhz的模型之间的关联关系。

2. 实现复制方法

为了实现复制主记录时同时复制One2many字段的明细数据,我们需要重写copy方法。代码如下:

class edoenginee_payresult(models.Model):

    _inherit = 'edoenginee_payresult'


    def copy(self, default=None):

        default = dict(default or {})

        new_child_records = []

        for child in self.fpayhz_ids:

            new_child = child.copy()

            new_child_records.append((4, new_child.id))

        default['fpayhz_ids'] = new_child_records

        return super(edoenginee_payresult, self).copy(default)

在上述copy方法中:

首先,我们对传入的default参数进行处理,如果default为None,则将其初始化为一个空字典。

然后,我们遍历主记录的fpayhz_ids字段,对于每个子记录child,调用其copy方法创建一个新的子记录new_child。

接着,我们使用 Odoo 中One2many字段的操作指令(4, id),将新创建的子记录的 ID 添加到new_child_records列表中。(4, id)指令表示将指定 ID 的记录关联到当前的One2many字段。

之后,我们将new_child_records列表赋值给default字典中的fpayhz_ids键,这样在调用父类的copy方法时,就会将这些新的子记录关联到复制后的主记录上。

最后,调用父类的copy方法,传入更新后的default字典,完成记录的复制操作。

3. 总结

通过以上步骤,我们成功实现了在 Odoo 中复制主记录时同时复制One2many字段的明细数据。在实际项目中,根据具体的业务需求,可能还需要对复制逻辑进行进一步的调整和优化,例如处理一些关联的计算字段、约束条件等。希望本文的内容能对大家在 Odoo 开发中处理类似问题有所帮助。

以上就是关于 Odoo 实现One2many字段复制的详细介绍,如有疑问或其他相关问题,欢迎加我微信随时交流。

博客
odoo给点击按钮执行操作时添加确认提示框