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

Odoo 11中one2many字段加载正常但保存后消失问题求助

Odoo v11中on_change填充One2many字段后保存消失的问题解决

我之前也碰到过类似的坑,这个问题的核心原因是Odoo v11对on_change方法的返回值处理以及One2many字段的赋值逻辑做了调整,和v10的兼容逻辑不一样。

你原来的代码在v10里能正常工作,是因为当时框架还支持通过返回value字典的方式给One2many字段赋值,但到了v11,新API下这种方式虽然能临时渲染出界面上的行数据,但保存时不会被正确写入数据库——框架不再识别这种直接传字典列表的格式,而且你同时在方法里直接给self的字段赋值又返回val,两种操作的冲突也会导致数据无法持久化。

解决方法:改用Odoo标准的One2many命令格式,直接操作记录集

Odoo里One2many字段的赋值必须使用三元组命令格式才能被正确持久化,同时v11+推荐直接通过self操作记录集,而不是返回value字典。修改后的代码如下:

@api.onchange("partner_id")
def onchange_partner_id(self):
    # 先清空两个One2many字段,用标准清空命令(5,0,0)
    self.zapocet_line_pohledavky = [(5, 0, 0)]
    self.zapocet_line_zavazky = [(5, 0, 0)]
    
    account_move_line_obj = self.env['account.move.line']
    pohledavky_ids = []
    zavazky_ids = []
    
    for statement in self:
        if statement.partner_id:
            domain = [
                ('account_id.user_type_id.type', 'in', ('payable', 'receivable')),
                ('move_id.state', '=', 'posted'),
                ('partner_id.id', '=', statement.partner_id.id),
            ]
            line_ids = account_move_line_obj.search(domain, order="date asc")
            for line in line_ids:
                if line.amount_residual != 0:
                    if line.credit > 0:
                        zavazky_ids.append(line.id)
                    elif line.debit > 0:
                        pohledavky_ids.append(line.id)
    
    # 用(6,0, [ids])命令一次性替换One2many字段的内容
    self.zapocet_line_pohledavky = [(6, 0, pohledavky_ids)]
    self.zapocet_line_zavazky = [(6, 0, zavazky_ids)]

关键修改点说明:

  • 清空字段的标准方式:用[(5, 0, 0)]代替原来的False,这是Odoo官方规定的清空关联字段的命令。
  • One2many赋值的正确格式:使用(6, 0, [ids])命令,代表将字段的内容替换为指定ID列表对应的记录,这种格式会被框架正确识别并在保存时写入数据库。
  • 去掉返回值:v11+的新API中,on_change方法直接操作self记录集即可,返回value字典的方式会和直接赋值冲突,导致数据丢失。
  • 优化条件判断:合并了amount_residual !=0的检查,让代码更简洁高效。

这样修改后,你会发现One2many字段的行数据不仅能正常加载,保存后也不会消失了。

内容的提问来源于stack exchange,提问作者Marek Jan-Alexander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:36:34