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


    目录

    前言

    env详解

    cr:当前数据库游标

    uid:当前用户id

    context:前后文字典

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

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

    self.env.is_superuser()

    self.env.is_admin()

    self.env.is_system()

    self.user

    self.env.lang()

    self.env.clear()

    self.env.in_draft

    self.env.in_onchange

    self.env[模型名]

    is_protected

    protected

    protecting

    fields_to_compute()

    records_to_compute()

    is_to_compute()

    not_to_compute()

    add_to_compute()

    remove_to_compute() 


    前言

    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工具库的全部内容了,相信一定能对你有所帮助~

    版权声明:该内容由神州数码云基地团队编撰,转载请注明出处!

    微信公众号后台回复“Odoo”,可加入技术交流群!

  • 相关阅读:
    yolov7训练危险品识别 pytorch
    【玩玩Vue】使用elementui页面布局和控制页面的滚动
    AtCoder Beginner Contest 332
    Tomcat多实例部署实验
    ACL(知识讲解+案列应用)
    通过SQL搜索DDL中的列注释(comment)
    微信小程序:tabbar、事件绑定、数据绑定、模块化、模板语法、尺寸单位
    明道云在艾默生数字化实践的新进展
    【python技巧】文本处理-re库字符匹配
    【离散化】【 树状树状 】100246 将元素分配到两个数组中
  • 原文地址:https://blog.csdn.net/CBGCampus/article/details/127614308