扫码阅读
手机扫码阅读

Odoo | env类详解看这篇就够了!

403 2023-09-08


Odoo

神州数码云基地

在 Odoo 上的尝试、调研与分享


env详解大揭秘

env,全称 environment,是 Odoo 中常用的工具类之一。我们知道运行代码之前要建立环境,随后在环境中执行函数,环境中的方法是能够直接使用的,而 env 便是这样的一种环境。

env 提供了 ORM 对象的封装,我们最常用的就是执行 SQL 和利用 ORM 操作模型以及使用模型中的方法。

注: ORM是一个完整关系对象映射层,开发人员不用编写基础的SQL语句。

接下来就让我们进入 env 的揭秘环节!

env详解

env 有以下四类最常用的功能

/ env四大常用功能

cr:当前数据库游标

在进行原始的数据库层面操作时,执行 SQL 语句,取到查询的返回数据,提交事务等等操作都离不开:

  • self.env.cr 创建的游标对象

  • self.env.cr.execute(SQL) 执行 sql 语句

  • self.env.cr.commit() 提交事务

uid:当前用户id

当要判断某用户是否有访问某某页面,创建某某问题的权限时,我们需要利用用户的 id,便可以使用:

  • self.env.uid 查询当前用户的id

context:前后文字典

  • self.context.get('key') 获取前后文字典

上下文数据的传输在同一个页面上使用不多,但在跳转页面、以及页面与页面的联动时,效果显著。

比如从页面A编辑进入页面B,从页面B查看进入页面C,以简单的三层页面嵌套来讲,从页面C返回页面B时仍然是从A进入B的编辑样式。


这一点从页面C返回到页面B是不知道的,所以就需要我们使用页面的上下文来记录页面的状态,更多更复杂的页面结构,都缺少不了这种状态的记录。

同样还有最简单的字段显示,重写了name_get方法的字段,如果没有上下文字典无法显示完成的字段信息。

su:是否在超级用户模式下

  • self(su=True)['res.users'].search() 设置超级管理员权限执行

在一些重要信息的进行执行时,我们可以使用超级管理员权限,将其放到最高优先级执行。

除了上述最常用的功能之外,env几乎包揽了所有可能需要的功能

ef:查询视图在数据库中的id

  • self.env.ref('模型下的视图id').id 查询视图id

该方法方便我们实现跳转视图,可直接跳转,也可以使用重定向调到指定 id 的视图,也可以使用 url 跳转,把到指定视图的 id 拼到 url 中。

我们使用 odoo 系统每次页面跳转的时候,url 里拼接的参数就是这次跳转行为的终点。

使用 ref 方法能查询到视图的 id 和动作的 id,从这一方面来讲,没有页面是拼接不了的。

self.env.is_superuser()

查询是否有处于超级管理员模式,返回布尔类型。

权限查询涉及的方面多是权限操作,特别是等级分明的业务场景上例如银行,权限的要求更加严格。

self.env.is_admin()

查询是否在‘access rights’组中,返回布尔类型。

self.env.is_system()

查询是否在‘setting’组中,返回布尔类型,权限类型依次降低。

self.user

获取当前用户的作为一个对象,该对象的属性都可以按需要取到。

self.env.lang()

查询语言类型,查询语言的方法封装的是self中默认的上下文语言信息

self.env.clear()

清除缓存,在一次失败的ORM中恢复操作可以使用。

如果执行了错误的操作,并且上次操作中修改过的属性会影响到后续操作的进行,这个时候就有必要清除缓存,在一个无干扰的环境下执行操作。

self.env.in_draft

查看是不是草稿状态。

self.env.in_onchange

查看是不是处于onchange状态。

self.env[模型名]

我们在开发中最常用的方法,从env中注册的模型,从而使用该模型中的方法。

模型中默认的查询、创建、更新、删除方法,以及自定义的方法函数都能使用。

self.env.clear_upon_failure()

清除环境上下文管理器(字段缓存再计算)

is_protected

返回记录是否了保护字段;字段被保护之后不能重新计算。

对于需要onchange的关联字段如果不能出发计算,要考虑到是不是因为字段被保护了

protected

保护字段不能失效或重新计算。

protecting

防止记录上的字段失效或者重新计算。

fields_to_compute()

返回要计算的字段的视图。

records_to_compute()

返回要计算字段的记录表。

is_to_compute()

返回是否必须在记录中计算的字段。

not_to_compute()

返回记录的子集,其中字段不能被计算。

add_to_compute()

标记字段要在记录上计算。

remove_to_compute()

返回是否必须在记录中计算的字段。

最后还需提及的一点是:当有多个任务同时进行时,各个任务分配相同的环境,基础设置相同的前提下,又相互隔离相互独立。

那么以上就是

有关env工具库的

全部内容了,

相信一定能对你有所帮助~


本期作者

后端开发工程师 张备

想要了解更多,点击 查看原文