odoo14 内置函数详解(可按需重写)
name_get
name_get方法在odoo中用于获取模型数据的显示名称,函数定义了该模型的记录在被关联、搜索时,所显示出来的名字,默认是使用name字段的值。当在form窗口中打开一个model时,会被调用,返回值为一个包含id和名称的元组组成的列表。
如果我们想自定义该模型的记录显示的名称,例如:使用 编码+name字段 显示的复合名称,则可以重写name_get()函数:
def name_get(self):
# 省后面添加国家代码 源码模块:res.country.state
result = []
for record in self:
result.append((record.id, "{} ({})".format(record.name, record.country_id.code)))
return result
name_search
name_get()定义了记录如何显示,那么name_search()则定义了记录如何被查找。name_search()定义了模型记录在被关联、被搜索时,通过输入的内容进行模糊查找的逻辑。
name_search在Many2one类型的模型上显示时被调用,返回结果是由id和repr的文本组成的元素列表。
默认情况下,是通过查找记录的 name 字段值是否与输入内容类似进行比对查找,我们可以改写模型的name_search()函数,把更多的字段加入比对中去。
@api.model
def name_search(self, name, args=None, operator='ilike', limit=查找条数):
"""
名称模糊搜索。
"""
args = args or []
domain = []
domain.append([(更多检索条件)])
return super(类名, self).name_search(name, domain + args, operator=operator, limit=limit)
或直接查找,返回所得记录集的name_get:
@api.model
def name_search(self,name='',args=None,operator='ilike',limit=100):
args = args or []
domain = []
if name:
domain = ['|',('name',operator,name),('其他比对字段',operator,name)]
pos = self.search(domain + args,limit=limit) //使用扩展后的条件进行查找
return pos.name_get() //把查找结果的name返回
fields_get
odoo models.Model 中 预置了很多的基本字段,比如 create_date, write_date 等等,odoo的 筛选和分组会默认使用这些字段,并且有时候可能是英文的,那么我们要如何处理这些字段呢?
我们可以做在odoo预置的方法 fields_get中进行处理,fields_get方法在每次进入tree视图的时候会执行,改变显示值实现格式如下:
@api.model
# 转换为英文
def fields_get(self, allfields=None, attributes=None):
res = super(OkrManageLine, self).fields_get(allfields, attributes)
for key, value in res.items():
if key == 'create_date':
res[key]['string'] = '创建时间'
elif key == 'write_date':
res[key]['string'] = '最后更新时间'
return res
调用父类fields_get的返回值是议程字典,我们可以通过判断字段的名称对其在筛选和分组中的显示标签进行调整
在筛选和分组中对一些字段进行隐藏实现格式如下:
@api.model
def fields_get(self, allfields=None, attributes=None):
# 过滤掉筛选中不显示项
res = super(SupplierInvoiceRecordPivot, self).fields_get(allfields, attributes)
filter_field = ['create_uid', 'write_date', 'create_date', 'write_uid', 'uid']
for key, value in res.items():
if key in filter_field:
res[key]['searchable'] = False
res[key]['sortable'] = False
return res
- res[key][‘searchable’] = False 设置字段 key 在筛选中不可见
- res[key][‘sortable’] = False 设置字段key在分组中不可见
default_get
default_get(fields) 函数用于初始化记录的默认值,对于模型的某些字段如果需要设置默认值,可以重写模型的default_get()函数达到目的。
例如:从表单中携带上下文信息跳转到向导、跳转到一个模型的新建表单视图等,可以在跳转时往context传递数据,然后在向导模型、被跳转创建的模型中重写default_get方法,从context中提前信息,进行字段默认值的初始化。
@api.model
def default_get(self, default_fields):
result = super(类名, self).default_get(default_fields)
context_data = self.env.context.get('key')
//根据context_data进行相关数据查询、处理操作
result.update({'字段': 默认值}) //更改记录的字段默认值
return result
向导设置默认值
class MyDialog(models.TransientModel):
_name = 'my.dialog'
message = fields.Char(string='提示')
@api.model
def default_get(self, fields_list):
record = super(MyDialog, self).default_get(fields_list)
record.update({
'message': '提示一下!',
})
return record
search
页面视图加载时会调用,用于获取数据记录集,我们可以重写函数添加domain筛选实现筛选显示
def search(self, args, offset=0, limit=None, order=None, count=False):
# 重写函数,返回指定记录
args = args or []
domain = []
if self.env.context.get('view_invoice_to_contract', False):
domain.extend([('state', '=', 'done'), ('invoice_id', '=', False)])
args += domain
return super(PurchaseContract, self).search(args, offset, limit, order, count)
search_count
统计返回条件范围内的记录数。它是根据search的结果进行统计计数,如果要计数,可以直接在search的时候加上count=true属性,这样计算更快。
# search_count源码
@api.model
def search_count(self, args):
""" search_count(args) -> int
根据search的结果进行统计
Returns the number of records in the current model matching :ref:`the
provided domain <reference/orm/domains>`.
"""
res = self.search(args, count=True)
return res if isinstance(res, pycompat.integer_types) else len(res)
search_read
页面视图加载时会先调用search()再调用search_read(),返回一个列表记录。many2one类型字段点开搜索更多时也会调用这个函数。
many2one字段可以通过添加context上下文,实现触发条件进行domain筛选显示
with_user
在 odoo13 以前的版本,sudo()后会将用户身份变更为超级用户执行。但经常我们是需要权限执行而不需要变更身份,因此要代码处理这些问题。在 odoo13 ,完美解决此问题,如果直接 sudo() 则只是提权, 用 sudo(user=n)才以某身份执行。更重要的是,已经不建议使用 sudo(),要使用 with_user。
with_user(superuser_id)
先暂时总结到这里,有空再总结其他的