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
相关产品推荐
相关产品推荐

