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
相关产品推荐
相关产品推荐

