Odoo 10 或更高版本 - 增强搜索

Odoo 10 or above - enhance search

删除 filter_domain 后,显示错误:


** 2018 年 2 月 1 日更新 **

这是我的..odoo/addons/ted/models/ted_inventory.py

路径下的一段代码
from odoo import api, fields, models

class TedInventory(models.Model):
    _inherit = 'stock.picking'

    trackingnum = fields.Char('trackingnum', readonly=True, index=True, help="Tracking number")  
    custom_name = fields.Char(string='Tracking Number',compute='_compute_custom_name',search='_search_custom_name')

    @api.multi
    @api.depends()
    def _compute_custom_name(self):
       ''' The field has to be a computed field
        You do not need to do anything here
       '''
       pass

    def _search_custom_name(self, operator, value):
        res = []
        if operator == 'ilike':
            query = "SELECT id FROM stock_picking WHERE position(trackingnum in %s) >= 1"
            self._cr.execute(query, (value,))
            res_ids = [x[0] for x in self._cr.fetchall()]
            res.append(('id', 'in', res_ids))
            return res

我确定我的应用程序已安装,因为我可以在 stock.picking 模型中找到 custom_name 和 trackingnum。

我还在 SearchView 中添加了一个新的搜索代码:

当我在这里这样搜索时,搜索结果是空的(因为我期望挖掘出TN1234的记录):

您使用的运算符是错误的,因为我喜欢将值搜索到字段中,但您需要另一种方式,将字段搜索到值中,我找到了解决您问题的方法,但我认为不是是最好的方法,但它有效:

In SQL: position(field in str), search field into str.

def _search_custom_name(self, operator, value):
    res = []
    if operator == 'ilike':
        query = "SELECT id FROM stock_picking WHERE position(trackingnum in %s) >= 1"
        self._cr.execute(query, (value,))
        res_ids = [x[0] for x in self._cr.fetchall()]
        res.append(('id', 'in', res_ids))
        return res

您还需要考虑其他运算符。

希望对您有所帮助!