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

如何跨表按字段搜索产品?产品模块name_search关联批次名实现咨询

在Odoo中通过批次名称实现产品的name_search搜索

要实现你想要的功能,核心是利用Odoo域查询的跨表关联能力,通过stock_quant_ids(产品关联的库存记录)关联到stock.production.lot的name字段。下面是完善后的代码,以及关键细节的解释:

完善后的代码

class ProductProduct(models.Model):
    _inherit = 'product.product'

    @api.model
    def name_search(self, name='', args=None, operator='ilike', limit=100):
        args = args or []
        # 仅当有搜索关键词时,尝试通过批次名称匹配产品
        if name:
            # 构建跨表查询的域条件:通过库存记录关联到批次的名称
            lot_search_domain = [('stock_quant_ids.lot_id.name', operator, name)]
            # 合并传入的额外条件,执行搜索
            recs = self.search(lot_search_domain + args, limit=limit)
            # 如果找到匹配的产品,直接返回结果
            if recs:
                return recs.name_get()
        # 没有匹配到批次相关产品,或无搜索词时,回退到默认的产品搜索逻辑
        return super(ProductProduct, self).name_search(name=name, args=args, operator=operator, limit=limit)

关键细节说明

  1. 跨表关联的域写法:('stock_quant_ids.lot_id.name', operator, name) 是Odoo域查询的标准用法,通过点号依次访问关联字段:
    • stock_quant_ids:product.product到stock.quant的one2many关联
    • lot_id:stock.quant到stock.production.lot的many2one关联
    • name:stock.production.lot的批次名称字段
  2. 逻辑优先级:先尝试批次搜索,只有当没有匹配结果时才调用父类的默认搜索,这样既实现了新功能,又保留了产品原本的搜索行为(比如按产品名称搜索)
  3. 条件合并:把批次搜索的域和传入的args合并,确保不会忽略其他可能的筛选条件(比如产品分类、状态等)

可选优化

如果需要只搜索有库存的批次对应的产品,可以修改域条件,添加库存数量的判断:

lot_search_domain = [
    ('stock_quant_ids.lot_id.name', operator, name),
    ('stock_quant_ids.quantity', '>', 0)
]

内容的提问来源于stack exchange,提问作者Mostafa A. Eldine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:38:34