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

时间:2018-05-15 13:33:29

标签: python odoo odoo-10

我试图修改现有模型mail.message的默认搜索引擎。

如果您查找单词 Hello ,搜索会返回record_name字段包含 Hello 的所有邮件。但是我需要它返回body包含 Hello 的所有消息。

mail.thread模型的One2many字段指向mail.message,许多模型都继承自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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你可以尝试:

@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]

答案 1 :(得分:1)

@Cherif评论是正确答案:

  

如果您希望某个模型的此行为,只需在搜索中添加一个过滤器   视图。但是如果你想对你正在做的所有模型都有这种行为   这是对的。只需更新您的代码即可考虑args   参数因为有时它包含其他域。

我没有考虑argsoperatorlimit参数,所以如果我不能调用super的{​​{1}} _name_search由于这种情况,至少我必须复制我不会修改的_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()