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

Odoo 11 TransientModel无法获取产品:Search方法使用困惑求助

在Odoo 11 TransientModel中正确使用search方法获取产品记录

我来帮你排查下问题,其实TransientModel里用search和普通Model的逻辑基本一致,你的代码里大概率是几个细节没处理对,导致没拿到预期结果。

常见问题点及修正方案

  1. 变量名拼写错误
    你代码里写的是produtc_obj,少了一个字母t,应该是product_obj——这种低级拼写错误会直接导致搜索逻辑失效,连模型对象都获取不到。

  2. 模型对象混淆
    要明确你要搜索的是product.product(产品变体)还是product.template(产品模板):

    • product.product(变体)才有product_tmpl_id字段,关联对应的产品模板
    • 如果误把product.template作为搜索对象,那product_tmpl_id字段根本不存在,自然搜不到任何记录
  3. 上下文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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:02:17