我们精通 Odoo,了解如何使用关系字段来建立不同模型之间的联系。为了填充这些关系字段,我们经常需要从一整套可用记录中搜索并找到特定值。Odoo 的名称搜索功能简化了此搜索过程,提供了一种根据我们的特定需求自定义搜索的便捷方式。
深入探讨名称搜索功能并深入探讨其各种用例。
Odoo 16中的名称搜索功能用于搜索模型中通过关系字段链接的记录。可以使用部分值或记录默认“名称”字段以外的字段进行此搜索。默认情况下,在 Many2one 字段中,您可以通过键入名称来搜索和选择记录。但是,如果您希望使用不同的参数或条件进行搜索,则可以利用 name_search 函数来实现此级别的自定义。
让我们看一个 Odoo 示例。当在新的销售订单报价单或发票的客户字段中输入客户姓名时,可以从以前的记录中进行搜索。
此外,当我们输入联系人的电子邮件 ID 时,可以搜索该特定记录,如下例所示。
您可能还会注意到,我们可以使用部分电子邮件地址或姓名进行搜索。要获取此属性,请使用姓名搜索功能。
下面看一下名称搜索函数的定义。
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
# code
return self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
* name (str) - 与名称匹配的模式。
* args(列表) ——用于搜索以指示附加限制的可选域。
* operator (str):匹配名称的域运算符,如“like”、“ilike”、“=”等等
* 限制(int):此选项允许您指定最多返回多少条记录。
* name_get_uid — 限制用户或指定用户。
假设我们需要在销售订单中包含电话号码来查找消费者。为此,我们必须继承该模型并在“res.partner”中定义一个名称搜索函数。
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.model
def _name_search(self, name='', args=None, operator='ilike', limit=100, name_get_uid=None):
args = list(args or [])
if name:
args += ['|', '|', ('name', operator, name), ('email', operator, name),
('phone', operator, name)]
return self._search(args, limit=limit, access_rights_uid=name_get_uid)
‘args’ 的默认值设置为 None。要自定义名称搜索函数的条件,我们可以指定一个域并将‘args’列表合并到函数中。
现在,也可以使用电话号码搜索联系人。
您可以在域内提供多个选项,并对 Many2one 字段使用点('.')运算符。
例如,如果您希望包含使用州名称进行搜索的选项,则可以通过在 Many2one 字段“state_id”上调用点运算符作为“state_id.name”来访问它。因此,“args”列表如下:
args += ['|', '|', '|', ('name', 操作员, name), ('phone', 操作员, name), ('email', 操作员, name), ('state_id.name', 操作员, name)]
让我们探索“res.city”模型中名称搜索功能的另一个示例。“res.city”使用 name_get 函数,将邮政编码合并到其显示名称中。因此,当 Many2one 字段与此模型关联并启动搜索时,将显示一个包含其增强显示名称(包括邮政编码)的列表。
class ResCity(models.Model):
_name = 'res.city'
_description = 'City'
_order = 'name'
name = fields.Char(string="Name", help='Name of city', required=True,
translate=True)
zipcode = fields.Char(string="Zip", help='Zip of city')
country_id = fields.Many2one('res.country', string='Country',
help='Country to which the city belongs to',
required=True)
state_id = fields.Many2one('res.country.state', string='State',
help='State to which the city belongs to',
domain="[('country_id', '=', country_id)]")
def name_get(self):
res = []
for city in self:
name = city.name if not city.zipcode else '%s (%s)' % (
city.name, city.zipcode)
res.append((city.id, name))
return res
@api.model
def _name_search(self, name='', args=None, operator='ilike', limit=100,
name_get_uid=None):
args = list(args or [])
if not (name == '' and operator == 'ilike'):
args += ['|', (self._rec_name, operator, name),
('zipcode', operator, name)]
return self._search(args, limit=limit, access_rights_uid=name_get_uid)
但是,使用邮政编码在记录中进行搜索是通过模型中定义的 name_search 函数实现的。您还可以观察到,在 name_search 函数中,我们使用了“self._rec_name”,并实现了“if”条件,以使用空字符串优化默认条件“ilike”,该条件与所有内容匹配。
事实上,同样地,我们可以自定义和定义Odoo中的name_search函数,以方便根据关系字段中的字段值搜索特定记录。