Odoo 11 TransientModel无法获取产品:Search方法使用困惑求助
在Odoo 11 TransientModel中正确使用search方法获取产品记录
我来帮你排查下问题,其实TransientModel里用search和普通Model的逻辑基本一致,你的代码里大概率是几个细节没处理对,导致没拿到预期结果。
常见问题点及修正方案
变量名拼写错误
你代码里写的是produtc_obj,少了一个字母t,应该是product_obj——这种低级拼写错误会直接导致搜索逻辑失效,连模型对象都获取不到。模型对象混淆
要明确你要搜索的是product.product(产品变体)还是product.template(产品模板):product.product(变体)才有product_tmpl_id字段,关联对应的产品模板- 如果误把
product.template作为搜索对象,那product_tmpl_id字段根本不存在,自然搜不到任何记录
上下文active_ids的有效性
你直接把active_ids当成产品模板ID,但要先确认:- 当前向导是从产品模板列表触发的吗?如果是从产品变体列表打开,
active_ids就是变体ID,这时候用product_tmpl_id去匹配就完全不对 - 可以先打印
active_ids确认内容,比如print("当前选中的ID:", self.env.context.get('active_ids')),确保是你需要的产品模板ID列表
- 当前向导是从产品模板列表触发的吗?如果是从产品变体列表打开,
修正后的完整代码示例
def action_get_product_codes(self): # 从上下文获取选中的记录ID,默认空列表避免报错 active_template_ids = self.env.context.get('active_ids', []) if not active_template_ids: # 没有选中任何产品模板,直接返回提示或空结果 return {'warning': {'title': '提示', 'message': '请先选中至少一个产品模板'}} # 指定要搜索的产品变体模型 product_variant_obj = self.env['product.product'] # 搜索所有关联选中模板的产品变体 product_recs = product_variant_obj.search([('product_tmpl_id', 'in', active_template_ids)]) # 提取default_code到结果列表 result_codes = [rec.default_code for rec in product_recs if rec.default_code] # 打印或返回结果 print("获取到的产品编码:", result_codes) return result_codes
额外调试技巧
- 打印中间结果:在代码中加入
print("选中的模板ID:", active_template_ids)和print("找到的变体数量:", len(product_recs)),快速定位是ID为空、搜索条件错误还是确实没有匹配的变体 - 检查权限:确保当前用户拥有
product.product模型的读权限,虽然TransientModel权限宽松,但产品模型的权限不足也会导致搜索无结果
内容的提问来源于stack exchange,提问作者Hassan ALi
相关产品推荐
相关产品推荐

