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

如何在Odoo中将表单数据同时保存至两个模型A和B

实现Odoo表单提交同时存入两个模型的方案

嘿,这个需求我之前帮朋友处理过类似的备份场景,在Odoo里有几个挺靠谱的实现方式,给你详细说说:

方案一:重写模型A的create方法(最推荐,通用性拉满)

这个方法的核心思路是:不管是HTML表单提交,还是后台手动创建、导入数据,只要创建模型A的记录,就自动同步创建模型B的备份记录。因为两个模型字段完全一致,直接复用提交的参数就行。

在模型A的Python文件里添加以下代码:

from odoo import models, fields, api

class ModelA(models.Model):
    _name = 'model.a'
    # 这里是你已经定义好的所有字段,和ModelB完全一致

    @api.model
    def create(self, vals):
        # 先正常创建模型A的记录
        record_a = super(ModelA, self).create(vals)
        # 同步创建模型B的备份记录,直接用传入的vals参数(字段完全一致无需修改)
        self.env['model.b'].create(vals)
        return record_a

为什么推荐这个方案?

  • 覆盖所有创建模型A的场景:不管是HTML表单、后台手动新增、批量导入,只要生成A的记录,B都会自动备份,完美满足你的备份需求。
  • 代码简洁,维护成本低:只需要修改模型A的代码,不需要改动表单的提交逻辑。

方案二:仅针对HTML表单提交做同步(局限性较强)

如果你只想让HTML表单提交的数据同步到B,而其他方式创建的A记录不需要备份,可以自定义表单的提交控制器,在保存A之后手动保存B。

首先找到HTML Form Builder生成的表单提交路由,替换成自定义的控制器:

from odoo import http
from odoo.http import request

class CustomFormSubmitController(http.Controller):
    @http.route('/your/form/submit/path', type='http', auth='public', website=True)
    def custom_form_submit(self, **post):
        # 注意:如果表单是公开访问的,需要用sudo()确保有创建记录的权限
        # 先创建模型A的记录
        record_a = request.env['model.a'].sudo().create(post)
        # 同步创建模型B的备份记录
        request.env['model.b'].sudo().create(post)
        # 返回表单提交成功的页面(替换成你自己的成功页面视图)
        return request.render('your_module_name.form_success_page')

注意事项

  • 这个方案只对该HTML表单的提交生效,后台手动创建A的记录不会同步到B。
  • 需要确保表单的提交按钮指向你自定义的路由,替换掉原来的默认路由。

额外补充:如果后续需要同步更新/删除

如果之后你需要把模型A的更新、删除操作也同步到模型B,可以继续重写模型A的write和unlink方法:

# 同步更新逻辑
def write(self, vals):
    res = super(ModelA, self).write(vals)
    # 假设模型B里有一个关联字段a_id指向模型A,用来匹配对应的备份记录
    for record in self:
        record_b = self.env['model.b'].search([('a_id', '=', record.id)], limit=1)
        if record_b:
            record_b.write(vals)
    return res

# 同步删除逻辑(如果需要删除备份的话)
def unlink(self):
    # 先删除对应的模型B备份记录
    for record in self:
        record_b = self.env['model.b'].search([('a_id', '=', record.id)], limit=1)
        if record_b:
            record_b.unlink()
    return super(ModelA, self).unlink()

以上几个方案里,方案一绝对是性价比最高的,一劳永逸解决备份问题。如果还有字段特殊处理、权限配置之类的细节问题,可以再补充说明~

内容的提问来源于stack exchange,提问作者Mingg Lex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:43:19