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

如何将Odoo中res.partner模型用户关联到POS订单?

问题分析与修正方案

你的核心问题是错误地将ManyToOne类型的partner_id字段按照ManyToMany的格式来构造数据了。Odoo的XMLRPC接口中,ManyToOne字段只需要直接传入关联记录的ID数值即可,不需要用Struct包装。

错误点说明

你当前代码里把partner_id包装成了一个Struct:

let mut partner_id_vec = BTreeMap::new();
partner_id_vec.insert("3".to_string(), Value::Int(625));
body.insert("partner_id".to_string(), Value::Struct(partner_id_vec));

这种格式是用来处理ManyToMany或OneToMany字段的(Odoo的RPC格式里这类字段用(操作符, ID列表)的结构,比如(3, 625)表示移除关联,但这不是ManyToOne的用法)。

修正后的代码

直接将partner_id设置为对应的ID的Value::Int即可,去掉多余的Struct包装:

//Somewhere in a function below
let mut body = BTreeMap::new();

// 直接传入res.partner的ID,不需要Struct包装
body.insert("partner_id".to_string(), Value::Int(625));
body.insert("amount_paid".to_string(), Value::Double(2000.00));
body.insert("amount_return".to_string(), Value::Double(0.00));
body.insert("amount_tax".to_string(), Value::Double(0.00));
body.insert("amount_total".to_string(), Value::Double(2000.00));
body.insert("name".to_string(), Value::from("jane doe"));

let order_val_str = Value::Array(vec![Value::Struct(body)]);

println!("order_val_str: {:?}", order_val_str);

let save_request = Request::new("execute_kw")
    .arg("db name")
    .arg(request_result.unwrap())
    .arg("My API key".to_string())
    .arg("pos.order")
    .arg("create")
    .arg(order_val_str);

println!("save_request: {:?}", save_request);

let result = save_request.call_url("https://my.odoo.com/xmlrpc/2/object");

补充说明

  • Odoo RPC字段格式规则:
    • ManyToOne:直接传目标记录的ID(整数类型)
    • ManyToMany/OneToMany:使用三元组或二元组结构,比如(4, ID)表示添加关联,(3, ID)表示移除关联,(6, 0, [ID1, ID2])表示替换关联列表
  • 如果你不确定字段类型,可以在Odoo后台的设置 -> 技术 -> 模型中查看pos.order的partner_id字段定义,确认其关系类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:06:02