You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Odoo 10通过XMLRPC添加销售订单行报错求助

解决Odoo XML-RPC添加销售订单行的报错问题

看起来你的代码思路是对的,但问题出在one2many字段的操作格式以及可能的必填字段缺失上。我来帮你梳理下正确的写法和排查方向:

第一步:修正One2Many字段的Write格式

Odoo中对one2many字段(比如sale.orderorder_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.lineproduct_uom(产品单位)是必填项,只传product_idproduct_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_idqtyproduct_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.

火山引擎 最新活动