为何Odoo中Compute方法仅在Tree视图中抛出错误?
问题排查与修复方案
错误原因
你的_compute_offers方法在Tree视图报错,核心问题是循环累加赋值one2many字段的方式在批量处理场景下不兼容:
- Tree视图会一次性加载多条记录,compute方法会批量处理这些记录;
- 原代码中每次循环
offer都执行rec.shop_offer_ids = rec.shop_offer_ids + offer,这种多次增量赋值会触发Odoo内部字段的频繁更新,在批量处理时容易引发赋值冲突,导致“Compute method failed to assign Error”。
修复后的代码
@api.depends("odoo_product_id") def _compute_offers(self): for rec in self: # 初始化字段,清空旧数据 rec.shop_offer_ids = False if rec.odoo_product_id: # 一次性搜索所有符合条件的offer记录 offers = self.env['demo.offers'].search([('product_id', '=', rec.odoo_product_id.id)]) # 使用标准语法一次性赋值给one2many字段 rec.shop_offer_ids = [(6, 0, offers.ids)]
关键修复点
- 一次性赋值:采用Odoo one2many字段的标准赋值语法
[(6, 0, ids_list)],直接替换字段所有记录,避免循环累加带来的多次更新操作; - 初始化字段:处理每条记录前先清空
shop_offer_ids,确保旧数据不会干扰新计算结果; - 批量兼容:该写法在Form(单条记录)和Tree(多条记录)视图下都能稳定运行,彻底解决批量处理时的赋值冲突问题。
内容的提问来源于stack exchange,提问作者Ravi Singh
相关产品推荐
相关产品推荐

