如何更改 Odoo 10 中模型的默认搜索字段?

How to change the default search field of a model in Odoo 10?

我正在尝试修改现有模型的默认搜索引擎mail.message

如果您查找单词 Hello,则搜索 returns 您所有 record_name 字段包含 Hello[= 的消息37=]。但我需要 returns 所有 body 包含 Hello.

的消息

mail.thread 模型有一个指向 mail.message 的 One2many 字段,许多模型继承自 mail.thread。例如,sale.order。因此,在 sale.order 的搜索视图中,您可以进行高级搜索并查找 Messages。但正如我在上面所写的,它会向您返回“标题”(字段record_name)包含您在搜索文本框中输入的单词的消息。

为了改变这一点,我这样做了:

@api.model
def _name_search(self, name='', args=None, operator='ilike', limit=100, name_get_uid=None):
    result = super(MailMessage, self)._name_search(
        name=name, args=args, operator=operator, limit=limit,
        name_get_uid=name_get_uid
    )
    mms = self.env['mail.message'].search([]).filtered(
        lambda r: name in r.body
    )
    l = [(r.id, r.record_name) for r in mms]
    return l

到目前为止它工作正常,但我不相信它在所有情况下都工作正常,而且我很确定一定有更好的方法来管理它。

有什么想法吗?

你能试试吗:

@api.model
def _name_search(self, name='', args=None, operator='ilike', limit=100, name_get_uid=None):
result = super(MailMessage, self)._name_search(
    name=name, args=args, operator=operator, limit=limit,
    name_get_uid=name_get_uid
)
mms = self.env['mail.message'].search([('body', 'like', name)])
return [(r.id, r.record_name) for r in mms]

@Cherif评论是正确答案:

If you want this behaviour for one model just add a filter in search view. But if you want this behavior for all models you are doing the right thing here. Just update your code to take in consideration args argument because sometimes it contains other domains.

我没有考虑 argsoperatorlimit 参数,所以如果我不能调用 super 15=] 鉴于这种情况,至少我必须复制 _name_search 的源代码部分,我不会修改:

class MailMessage(models.Model):
    _inherit = 'mail.message'

    @api.model
    def _name_search(self, name='', args=None, operator='ilike', limit=100,
                     name_get_uid=None):
        if args is None:
            args = []
        domain = args + [
            '|', ('model', operator, name), ('body', operator, name),
        ]
        return super(MailMessage, self).search(domain, limit=limit).name_get()