Odoo v8转v10 product_pack模块_product_available函数转换报错求助
解决Odoo v8到v10 _product_available 转换中的类型适配错误
这个错误的核心是Odoo从v8到v10的ORM API发生了根本性变化:传统的cr/uid/ids参数被记录集(Recordset)机制替代,你原来的代码试图传递ID列表给父类方法,和v10 ORM期望的记录集类型不匹配,才触发了can't adapt type 'product.product'错误。
下面是具体的修正方案和完整代码:
问题根源拆解
在v8中,_product_available需要手动传入ID列表来指定要计算的产品;但v10里,该方法直接作用于当前的记录集,方法内部会自动处理记录集里的所有产品,不需要再手动传ID列表。
修正后的完整v10代码
import math def _product_available(self, field_names=None, arg=False): # 仅过滤当前记录集中的打包产品(避免全局搜索) pack_products = self.filtered(lambda p: p.pack) # 调用父类方法获取非打包产品的库存数据(直接对记录集操作) res = super(product_product, self)._product_available(field_names, arg) for product in pack_products: pack_qty_available = [] pack_virtual_available = [] for subproduct in product.pack_line_ids: # 直接对子产品记录集调用库存方法,而非传ID列表 sub_stock_data = subproduct.product_id._product_available(field_names, arg)[subproduct.product_id.id] sub_qty = subproduct.quantity if sub_qty: pack_qty_available.append(math.floor(sub_stock_data['qty_available'] / sub_qty)) pack_virtual_available.append(math.floor(sub_stock_data['virtual_available'] / sub_qty)) # 计算打包产品的最终库存值 qty_available = min(pack_qty_available) if pack_qty_available else False virtual_available = max(min(pack_virtual_available), 0) if pack_virtual_available else False res[product.id] = { 'qty_available': qty_available, 'incoming_qty': 0, 'outgoing_qty': 0, 'virtual_available': virtual_available, } return res
关键修改点说明
- 过滤打包产品:用
self.filtered(lambda p: p.pack)替代原来的search,只处理当前记录集中的打包产品,而非全局搜索,更符合v10的ORM设计逻辑。 - 父类方法调用:直接对
self - pack_products(非打包产品记录集)调用父类方法,不需要手动传ID列表,完美适配v10的参数要求。 - 递归查询子产品:通过
subproduct.product_id._product_available()直接对子产品记录集调用方法,避免了ID列表到记录集的类型转换错误。
内容的提问来源于stack exchange,提问作者user3676872
相关产品推荐
相关产品推荐

