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

Odoo中通过代码添加POS商品行报错求助:TypeError问题排查

解决Odoo POS代码添加商品行的错误问题

错误原因

你遇到的TypeError: this.product.get_unit is not a function,是因为通过rpc调用read返回的是普通JSON对象,并非Odoo POS中封装好的Product模型实例——POS的Product实例才自带get_unit这类方法,普通对象没有这些内置方法。

修正后的代码

推荐使用POS原生的方式添加商品行,避免手动创建Orderline的繁琐:

const productId = 293;
let product = this.env.pos.db.product_by_id[productId];

if (!product) {
    // 商品未在本地缓存时,先获取数据并实例化
    const productData = await this.rpc({
        model: "product.product",
        method: "read",
        args: [[productId], this.env.pos.db.product_fields], // 同步POS默认加载的字段
    });
    // 转化为POS的Product实例
    product = new models.Product({}, {pos: this.env.pos, data: productData[0]});
    // 添加到本地缓存,方便后续使用
    this.env.pos.db.add_products([product]);
}

// 获取当前订单并添加商品
const currentOrder = this.env.pos.get_order();
currentOrder.add_product(product, {
    quantity: 1,
    price: -300, // 设置自定义价格
});

关键说明

  • 优先用本地缓存:this.env.pos.db.product_by_id存储了POS初始化时加载的所有商品实例,直接获取即可使用,无需重新请求
  • 正确实例化商品:如果商品不在缓存,必须用models.Product将rpc返回的原始数据封装为POS认可的实例,否则会缺少必要方法
  • 使用原生方法添加:order.add_product是POS官方推荐的添加商品方式,内部会自动处理Orderline的创建、数量设置等逻辑,比手动创建Orderline更稳定

原代码问题点

  • 手动创建Orderline时传入的product是普通对象,不是Product实例,导致set_quantity调用时找不到get_unit方法
  • add_product方法的参数应该是Product实例,而非手动创建的Orderline对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:37:32