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

