我试图修改现有模型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
到目前为止它工作正常,但我并不相信它在所有情况下都能正常工作,而且我非常确定必须有更好的方法来管理它
有什么想法吗?
答案 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 参数因为有时它包含其他域。
我没有考虑args
,operator
和limit
参数,所以如果我不能调用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()