如何为Odoo的Many2one客户字段添加名称+条形码搜索功能?
Odoo实现客户Many2one字段同时支持名称与条形码搜索
我在Odoo系统的sale.order模型中拥有一个关联res.partner的客户Many2one字段,该字段默认仅支持按名称搜索,我希望为其新增条形码搜索功能。
我尝试了以下两种方案,但均未达到预期效果:
- 方案1:在
sale.order模型中重写_name_search方法,添加partner_id.barcode的搜索域,但未生效。
代码如下:@api.model def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None): if self._context.get('sale_show_partner_name'): if operator == 'ilike' and not (name or '').strip(): domain = [] elif operator in ('ilike', 'like', '=', '=like', '=ilike'): domain = expression.AND([ args or [], ['|', '|', ('name', operator, name), ('partner_id.name', operator, name), ('partner_id.barcode', operator, name)] ]) return self._search(domain, limit=limit, access_rights_uid=name_get_uid) return super(SaleOrder, self)._name_search(name, args=args, operator=operator, limit=limit, name_get_uid=name_get_uid) - 方案2:在
res.partner模型中重写name_search方法,仅支持按条形码搜索客户,无法再按名称搜索。
代码如下:@api.model def name_search(self, name, args=None, operator='ilike', limit=100): if not self.env.context.get('display_barcode', True): return super(ResPartnerInherit, self).name_search(name, args, operator, limit) else: args = args or [] recs = self.browse() if not recs: recs = self.search([('barcode', operator, name)] + args, limit=limit) return recs.name_get()
请问如何实现同时按名称和条形码搜索客户的功能?
解决方案
正确的做法是在res.partner模型中重写name_search方法,将名称和条形码的搜索条件通过|逻辑运算符合并,保留原有的名称搜索逻辑,同时加入条形码的搜索条件:
from odoo import models, api, expression class ResPartner(models.Model): _inherit = 'res.partner' @api.model def name_search(self, name, args=None, operator='ilike', limit=100): args = args or [] # 当有搜索关键词时,同时匹配名称和条形码 if name: domain = ['|', ('name', operator, name), ('barcode', operator, name)] # 合并原有搜索条件 domain = expression.AND([domain, args]) recs = self.search(domain, limit=limit) else: # 无关键词时调用原方法,返回所有符合条件的记录 recs = super().name_search(name, args, operator, limit) return recs.name_get()
说明
- 当用户输入搜索关键词时,通过
|运算符构建同时匹配name和barcode的搜索域,再和传入的args合并,保证原有业务逻辑不受影响。 - 无搜索关键词时,直接调用父类方法,保持默认的行为。
- 不需要修改
sale.order的_name_search方法,因为Many2one字段的搜索逻辑是由关联模型(res.partner)的name_search控制的,之前修改sale.order的方法无效是因为方向错误。
内容的提问来源于stack exchange,提问作者user20349495
相关产品推荐
相关产品推荐

