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

Odoo 13中ORM API的onchange在many2many字段上失效

Odoo13销售订单行onchange更新many2many字段无效问题解决

问题描述

在Odoo 13的销售订单行(sale_order_line)表单视图中,修改product_id字段时,通过onchange方法同步更新关联的many2many类型字段mf_ids,但字段值未在视图中生效。

现有实现代码:

@api.onchange("product_id")
def _fetch_mf_ids(self):
    for rec in self:
        rec.mf_ids = [
            (6, 0, [x.id for x in rec.product_id.mf_ids])
        ]

调试打印rec.mf_ids时得到非存储值:

product.mf.pgm(<NewId origin=5>, <NewId origin=7>)

原因分析

onchange方法执行时,当前记录处于未保存的临时状态,Odoo会用临时ID(NewId)标记未持久化的记录。直接使用(6, 0, ids)的many2many赋值命令,视图无法正确识别这些临时关联关系,导致更新不生效。

修复方案

方案1:直接赋值记录集(最简可靠)

在onchange上下文里,直接把关联的记录集赋值给mf_ids,Odoo会自动处理底层的命令转换,规避临时ID问题:

@api.onchange("product_id")
def _fetch_mf_ids(self):
    for rec in self:
        rec.mf_ids = rec.product_id.mf_ids

方案2:使用清空+逐个添加的命令组合

先清空现有值,再用(0, 0, values)命令逐个添加关联记录,确保视图能正确识别:

@api.onchange("product_id")
def _fetch_mf_ids(self):
    for rec in self:
        # 先清空当前mf_ids
        rec.mf_ids = [(5, 0, 0)]
        # 逐个添加产品关联的mf记录
        for mf in rec.product_id.mf_ids:
            rec.mf_ids += [(0, 0, {'id': mf.id})]

方案3:返回domain强制视图刷新

如果前两种方法无效,可通过返回domain的方式,强制视图重新加载mf_ids的当前值:

@api.onchange("product_id")
def _fetch_mf_ids(self):
    for rec in self:
        rec.mf_ids = rec.product_id.mf_ids
    # 返回domain触发视图刷新
    return {'domain': {'mf_ids': [('id', 'in', self.mf_ids.ids)]}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:50:46