Odoo中如何基于其他表单的boolean字段值更新指定表单的boolean字段
Odoo跨模型字段联动实现方案
前提:假设你已经通过自定义模块给mrp.production模型新增了字段mrp_boolean,给stock.picking模型新增了字段stock_boolean。Odoo标准逻辑中stock picking的origin字段默认会关联对应MRP生产单的编号,你也可以自定义mrp_production_id多对一字段直接绑定对应生产单,关联查询性能会更高。
实现方式1:重写write方法(全场景适用,最稳定)
该方案不管是前端界面修改、后端代码调用修改、API接口修改字段都会触发联动逻辑,无遗漏。
from odoo import models, fields, api class StockPicking(models.Model): _inherit = 'stock.picking' stock_boolean = fields.Boolean(string='库存触发标识') # 可选:自定义直接关联字段,性能更优 # mrp_production_id = fields.Many2one('mrp.production', string='关联生产单') def write(self, vals): res = super(StockPicking, self).write(vals) # 检测stock_boolean是否被设置为True if 'stock_boolean' in vals and vals['stock_boolean']: for picking in self: # 方式A:通过origin字段查找关联MRP生产单 if picking.origin: mrp_order = self.env['mrp.production'].search([('name', '=', picking.origin)], limit=1) if mrp_order: mrp_order.write({'mrp_boolean': True}) # 方式B:如果使用自定义关联字段,替换为以下逻辑 # if picking.mrp_production_id: # picking.mrp_production_id.write({'mrp_boolean': True}) return res
实现方式2:onchange装饰器(仅前端界面修改场景适用)
如果只需要用户在前端手动勾选stock_boolean时触发联动,可以用更轻量的onchange实现:
from odoo import models, fields, api class StockPicking(models.Model): _inherit = 'stock.picking' stock_boolean = fields.Boolean(string='库存触发标识') @api.onchange('stock_boolean') def _onchange_stock_boolean(self): if self.stock_boolean and self.origin: mrp_order = self.env['mrp.production'].search([('name', '=', self.origin)], limit=1) if mrp_order: mrp_order.write({'mrp_boolean': True})
注意:该方案仅触发前端操作的字段变更,后端代码、API修改字段不会触发联动,适合要求不高的轻量场景。
注意事项
- 如果一个stock picking可能对应多个MRP生产单,去掉
search方法的limit=1参数,即可批量更新所有匹配到的生产单 - 如果遇到权限不足的报错,可以加
sudo()提升权限执行写入操作,示例:mrp_order.sudo().write({'mrp_boolean': True}) - 代码编写完成后升级对应自定义模块即可生效
内容的提问来源于stack exchange,提问作者Sakthi Priya
相关产品推荐
相关产品推荐

