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

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字段依赖关联字段来实现。

测试方法

  1. 在拣货单表单中手动勾选Generated字段并保存,对应的生产单的Generated Report字段应该自动变为True。
  2. 如果你的报表下载按钮调用了mark_boolean_true()方法,点击按钮后generated会被设为True,接着上面的逻辑会自动同步更新生产单的字段。

内容的提问来源于stack exchange,提问作者Sakthi Priya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:47:45