如何在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
相关产品推荐
相关产品推荐

