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

Odoo10及以上搜索增强问题:移除filter_domain后报错且搜索无结果

解决Odoo自定义搜索字段无结果的问题

我来帮你排查这个搜索失效的问题,看了你的代码后,发现几个关键问题需要调整:

1. SQL查询逻辑完全颠倒了

你当前的SQL语句用了 position(trackingnum in %s),这是在检查**trackingnum字符串是否包含在搜索值value里**,而你的实际需求应该是反过来——检查搜索值value是否包含在trackingnum字段中。这就是为什么搜索TN1234时找不到结果的核心原因。

举个例子:如果某条记录的trackingnum是TN12345,你搜索TN1234,trackingnum(TN12345)并不包含在value(TN1234)里,所以查询返回空。

2. 修正后的代码示例

把_search_custom_name函数修改成下面这样,同时优化SQL写法并处理更多搜索操作符:

def _search_custom_name(self, operator, value):
    res = []
    if operator in ('ilike', 'like'):
        # 使用ILIKE实现大小写不敏感的模糊匹配,更符合Odoo的ilike语义
        query = "SELECT id FROM stock_picking WHERE trackingnum ILIKE %s"
        # 给搜索值前后加%,实现前后模糊匹配
        self._cr.execute(query, (f'%{value}%',))
        res_ids = [x[0] for x in self._cr.fetchall()]
        res.append(('id', 'in', res_ids))
    elif operator == '=':
        # 处理精确匹配的场景
        query = "SELECT id FROM stock_picking WHERE trackingnum = %s"
        self._cr.execute(query, (value,))
        res_ids = [x[0] for x in self._cr.fetchall()]
        res.append(('id', 'in', res_ids))
    elif operator == 'not ilike':
        # 处理反向模糊匹配
        query = "SELECT id FROM stock_picking WHERE trackingnum NOT ILIKE %s"
        self._cr.execute(query, (f'%{value}%',))
        res_ids = [x[0] for x in self._cr.fetchall()]
        res.append(('id', 'in', res_ids))
    # 可以根据需求扩展更多操作符的处理
    return res

3. 额外验证步骤

  • 确认trackingnum字段确实有值:在列表视图中添加trackingnum字段列,检查你要搜索的TN1234是否存在于某条记录的trackingnum中。
  • 确认SearchView配置正确:确保你已经把custom_name字段添加到了搜索视图里,比如:
    <search>
        <!-- 其他搜索字段 -->
        <field name="custom_name" string="Tracking Number"/>
    </search>
    
  • 清除Odoo缓存:修改代码后,记得升级模块并刷新页面,确保新代码生效。

内容的提问来源于stack exchange,提问作者cyliinhk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:35:19