Odoo MRP模块中报表下载后自动更新关联表单布尔字段的实现求助
解决思路与修正代码
看起来你已经搭好了基础框架,但在跨模型字段更新的逻辑上还有几个小问题需要调整。我来帮你修正代码,实现当拣货单(stock.picking)的generated字段设为True时,自动同步更新对应生产转移单(mrp.production)的generated_report字段。
第一步:优化stock.picking模型代码
我们需要确保当generated字段被设置为True时,能主动找到关联的生产单并更新对应字段:
from odoo import models, fields, api class ReportGeneration(models.Model): _inherit = 'stock.picking' generated = fields.Boolean(string='Generated') # 重写write方法,当generated字段被修改时触发生产单更新 def write(self, vals): # 先执行原有的write逻辑 res = super().write(vals) # 如果本次修改包含generated字段,且设置为True if 'generated' in vals and vals['generated'] is True: # 通过Odoo自带的production_id关联字段,找到所有对应的生产单 related_productions = self.mapped('production_id') if related_productions: # 批量更新生产单的generated_report字段为True related_productions.write({'generated_report': True}) return res # 保留你原来的按钮触发方法(如果报表下载按钮调用这个方法) def mark_boolean_true(self): self.generated = True
第二步:修正mrp.production模型代码
这里我们调整generated_report的计算逻辑,让它直接依赖关联拣货单的generated字段,确保数据实时同步:
class ReportGen(models.Model): _inherit = 'mrp.production' generated_report = fields.Boolean( string='Generated Report', store=True, compute='_compute_generated_report' ) @api.depends('move_ids.picking_id.generated') def _compute_generated_report(self): for production in self: # 获取当前生产单关联的所有拣货单 related_pickings = production.move_ids.mapped('picking_id') # 只要有一个关联的拣货单generated为True,就把生产单的字段设为True production.generated_report = any(picking.generated for picking in related_pickings)
关键修改说明
- 用官方关联字段替代origin搜索:Odoo的
stock.picking自带production_id字段直接关联mrp.production,比用origin字段搜索更可靠(origin可能存在重复或格式问题)。 - 修正compute字段的依赖关系:原来的
@api.depends('ref')完全不对,我们改成依赖move_ids.picking_id.generated,这样当关联拣货单的generated变化时,生产单的字段会自动重新计算。 - 去掉多余的
ref字段:你定义的ref是related='name',完全没必要,生产单的name本身就能直接用,而且关联关系不需要这个字段来维护。 - 废弃无效的
onchange方法:@api.onchange('so.generated')写法错误,onchange只能监听当前模型的字段,跨模型的更新需要通过write方法触发或者compute字段依赖关联字段来实现。
测试方法
- 在拣货单表单中手动勾选
Generated字段并保存,对应的生产单的Generated Report字段应该自动变为True。 - 如果你的报表下载按钮调用了
mark_boolean_true()方法,点击按钮后generated会被设为True,接着上面的逻辑会自动同步更新生产单的字段。
内容的提问来源于stack exchange,提问作者Sakthi Priya
相关产品推荐
相关产品推荐

