如何跨表按字段搜索产品?产品模块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)
关键细节说明
- 跨表关联的域写法:
('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的批次名称字段
- 逻辑优先级:先尝试批次搜索,只有当没有匹配结果时才调用父类的默认搜索,这样既实现了新功能,又保留了产品原本的搜索行为(比如按产品名称搜索)
- 条件合并:把批次搜索的域和传入的
args合并,确保不会忽略其他可能的筛选条件(比如产品分类、状态等)
可选优化
如果需要只搜索有库存的批次对应的产品,可以修改域条件,添加库存数量的判断:
lot_search_domain = [ ('stock_quant_ids.lot_id.name', operator, name), ('stock_quant_ids.quantity', '>', 0) ]
内容的提问来源于stack exchange,提问作者Mostafa A. Eldine
相关产品推荐
相关产品推荐

