如何更改 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.
我没有考虑 args
、operator
和 limit
参数,所以如果我不能调用 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()
我正在尝试修改现有模型的默认搜索引擎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.
我没有考虑 args
、operator
和 limit
参数,所以如果我不能调用 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()