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

