Odoo 10通过XMLRPC添加销售订单行报错求助
解决Odoo XML-RPC添加销售订单行的报错问题
看起来你的代码思路是对的,但问题出在one2many字段的操作格式以及可能的必填字段缺失上。我来帮你梳理下正确的写法和排查方向:
第一步:修正One2Many字段的Write格式
Odoo中对one2many字段(比如sale.order的order_line)执行write操作时,必须传入操作指令的列表,而不是单个元组。你之前直接传了(0, '_', {...}),这会触发字段验证错误。
正确的写法应该把指令放在列表里,并且第二个参数应该是0(不是'_'):
r = api.execute_kw(db, uid, pwd, 'sale.order', 'write', [[sc]], { 'order_line': [(0, 0, { 'product_id': id, 'product_uom_qty': qty, # 关键:很多Odoo版本里product_uom是必填字段,必须加上 'product_uom': product_uom_id # 需要替换为对应产品的单位ID })] })
这里的三元组(0, 0, vals)表示创建一条新的关联记录(也就是新订单行),三个参数的含义:
- 第一个
0:操作类型(创建新记录) - 第二个
0:预留参数,固定传0即可 - 第三个
vals:新订单行的字段值字典
第二步:补充必填字段
大部分Odoo版本中,sale.order.line的product_uom(产品单位)是必填项,只传product_id和product_uom_qty会导致保存失败。你可以先通过XML-RPC获取产品的默认单位ID:
# 获取目标产品的默认单位ID product_info = api.execute_kw( db, uid, pwd, 'product.product', 'read', [[id]], # id是你的产品ID ['uom_id'] ) # product_info返回的是列表,取第一个元素的uom_id(格式是(单位ID, 单位名称)) product_uom_id = product_info[0]['uom_id'][0]
第三步:排查其他可能的报错原因
如果修正后还是报错,你可以从这几个方向检查:
- 订单状态:确认目标销售订单
sc处于可修改状态(比如未确认、未关闭),已确认的订单可能需要先取消才能修改 - 权限问题:当前用户
uid需要拥有修改sale.order和创建sale.order.line的权限 - 记录有效性:确保
sc(销售订单ID)、id(产品ID)都是真实存在的有效记录 - 数据类型:
product_id、qty、product_uom_id都必须是整数类型,不能传字符串
完整示例代码
把上面的步骤整合起来,完整的工作代码如下:
# 配置参数 db = "your_database_name" uid = 1 # 你的用户ID pwd = "your_password" api_url = "http://your_odoo_url/xmlrpc/2/object" # 假设你用的是object endpoint # 目标数据 sale_order_id = sc # 你的销售订单ID product_id = 123 # 要添加的产品ID qty = 5 # 订购数量 # 1. 获取产品默认单位 product_info = api.execute_kw( db, uid, pwd, 'product.product', 'read', [[product_id]], ['uom_id'] ) if not product_info: raise ValueError(f"产品ID {product_id} 不存在") product_uom_id = product_info[0]['uom_id'][0] # 2. 添加订单行 try: result = api.execute_kw( db, uid, pwd, 'sale.order', 'write', [[sale_order_id]], { 'order_line': [(0, 0, { 'product_id': product_id, 'product_uom_qty': qty, 'product_uom': product_uom_id })] } ) print(f"订单行添加成功,返回结果:{result}") except Exception as e: print(f"报错详情:{str(e)}")
如果还是有问题,建议你把完整的Traceback信息贴出来,里面会有更具体的错误提示(比如某个字段缺失、权限不足等),方便进一步排查。
内容的提问来源于stack exchange,提问作者M.E.




