odoo中的name_get和name_search方法

name get方法

name_get方法在odoo中用于获取模型的显示名称,当在form窗口中打开一个model时,会被调用,返回值为一个包含id和名称的元组组成的列表。

1
2
3
4
5
@api.multi
def name_get(self):
values = super(Demo, self).name_get()
_logger.info(f"name_get方法返回的结果:{values}")
return values

调用返回的结果:

name_search方法

name search方法接受4个参数:

  • name: 被搜索的关键字
  • args: 限定条件domain
  • operator: 操作符,可选的参数有:=,!=,>,>=,<,<=,like,ilike,in,not in,child_of,parent_left,parent_right
  • limite: 搜索结果的条数。

name search在Many2*类型的模型上显示时被调用,返回结果是由id和repr的文本组成的元素列表。

从结果上看,name_search方法并没有返回一个带文本的列表,而是一个延迟计算的函数,这是因为,在原生name_search方法中调用了lazy_name_get方法导致的,从这里也可以看出name_search和name_get方法的关系,即,由name_search方法限制条件过滤,然后再把结果传给name_get方法进行显示。

低阶_name_search方法

其实在更底层的层面上,还有一个_name_search方法,与name_search方法不同的是_name_search方法接受额外的一个参数:name_get_uid,这个参数的作用是指定一个调用_search和lazy_name_get方法的用户ID,用来解决当前用户权限不足的问题。

比如当前我有一个模型osc.person,没有任何一个组有权限访问,正常访问会试如下的界面:

当我们给_name_search方法传一个uid=1进去的时候:

1
2
3
4
5
6
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
_logger.info(f"私有name search方法被调用,参数:{name,args,operator}")
res = super(Person, self)._name_search(name, args, operator, limit, 1)
_logger.info(f"结果:{res}")
return res

就可以正常显示了。

你的支持我的动力