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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:55:52