基础问题:

  1. Model和TransientModel区别是什么?什么场景下应该使用TransientModel?
  2. 字段的compute属性是用来做什么的?如何将包含compute属性的字段的值存储到数据库中?
  3. 如何创建一个索引字段?
  4. 如何设置一个字段的默认值?默认值可以是一个函数吗?
  5. 如何给限定某个字段只能由某个让用户组的人访问?
  6. 如何将某个字段设置为提权访问(admin)?
  7. api.model的作用是什么?
  8. create方法接受的参数是什么类型?

回答1:

1. Model和TransientModel的区别在于,Model是持久化的,可以在数据库中保存数据,而TransientModel不会保存到数据库。应该在需要暂存临时数据的场景下使用TransientModel。

2. 字段的compute属性用于计算字段值,通常通过读取或操作其他字段来计算。这些计算字段的值不会被存储到数据库中,

而是在每次请求时动态生成。如果要将计算字段的值存储到数据库中,应该设置store=True属性。

3. 可以使用@api.depends('field_name')和@api.depends_context('key_name')等装饰器来创建索引字段。具体实现方式取决于Odoo的版本和所选的ORM。

4. 可以使用默认值属性(default)或者计算属性(compute)来设置字段的默认值。默认值可以是函数,但必须返回一个新值而不能修改任何现有对象。

5. 可以使用groups属性限制某个字段只能由某个用户组访问。例如: groups="base.group_user,my_module.my_group"

6. 可以使用access_rights属性将字段设置为提权访问(admin)。例如: access_rights={'write': 'base.group_system'}

7. api.model(也称为模型API)提供ORM语法及相关方法,可用于创建、读取、更新和删除模型的记录,还提供了一些辅助函数。

8. create方法接受一个字典类型的参数,包含待创建记录的字段名和对应的值。例如: {'field_name_1': value_1, 'field_name_2': value_2}

中级问题:

  1. 什么是开发者模式?开发者模式中的三种模式的区别是什么?
  2. models中inherit和inherits的区别是什么?
  3. Binary字段与附件对象有什么关系?如何更改附件默认存储的位置?
  4. base模块和web模块分别在系统中扮演什么样的角色?
  5. 如何将自定义的widget添加到系统中?
  6. csrf_token是什么?有什么作用?是如何生成的?
  7. 为什么jsonrpc中不用传csrf_token?
  8. Session是如何存储的?odoo是如何判断Session是否有效的?
  9. 配置文件中的limit_memory_soft和limit_memory_hard区别是什么?
  10. 如何更新系统中全部的模块?其原理是怎样的?

回答2:

1. 什么是开发者模式?开发者模式中的三种模式的区别是什么?

开发者模式是一种Odoo应用程序的高级用户界面,它允许开发者和系统管理员以更灵活的方式定制、配置和管理Odoo系统。开发者模式中包含三种模式:

- 普通模式:默认模式,只显示常用的功能和菜单。
- 调试模式:提供了额外的调试选项,如查看日志信息、查看数据库表结构等。
- 工程师模式:最高级别的模式,允许进行系统文件的修改、添加自定义代码等操作。

2. models中inherit和inherits的区别是什么?

`inherit` 和 `inherits` 都是Odoo中用于继承模型的关键词,但它们的作用略有不同:

- `inherit` 用于向一个已存在的模型追加字段,方法和视图等,可以多次使用。
- `inherits` 用于创建一个新的模型,并从指定的父模型中继承所有的字段、方法和视图等。

3. Binary字段与附件对象有什么关系?如何更改附件默认存储的位置?

在Odoo中,Binary字段用于存储二进制数据(例如图片、文档等),而附件对象则用于管理这些二进制数据的存储和访问。每个附件对象都对应一个二进制数据文件,并在数据库中存储一条记录,该记录包含了文件的元数据信息(如文件名、文件类型等)。

要更改附件默认存储的位置,可以设置系统参数 `ir_attachment.location` 的值。默认情况下,此参数为 `file`,表示将附件文件存储在文件系统中。如果要将附件文件存储在Amazon S3或其他云服务商中,请参考Odoo文档中的相关说明进行配置。

4. base模块和web模块分别在系统中扮演什么样的角色?

- `base` 模块是Odoo系统的核心模块之一,提供了许多基础功能,如用户管理、安全认证、多语言支持、邮件发送等。
- `web` 模块是Odoo系统中负责处理Web请求和响应的模块,提供了许多与Web界面相关的功能,如路由、控制器、模板引擎等。

5. 如何将自定义的widget添加到系统中?

要将自定义的widget添加到Odoo系统中,可以按照以下步骤操作:

- 创建一个新的Odoo模块,包含必要的Python代码和XML视图文件。
- 在XML视图文件中使用 `<script>` 标签加载自定义widget所需的JavaScript和CSS文件。
- 在Python代码中继承 `odoo.http.WebController` 类,并使用 `@http.route()` 装饰器将自定义widget的路由注册到系统中。

6. csrf_token是什么?有什么作用?是如何生成的?

`csrf_token` 是一种安全措施,用于保护Web应用程序免受跨站请求伪造(CSRF)攻击。它是一个随机生成的字符串,每次请求时都必须包含在请求的数据中。Odoo系统中的 `csrf_token` 是通过调用 `_compute_session_token()` 方法生成的,该方法使用用户的Session ID、当前时间戳和一些其他参数计算出一个唯一的token值。

7. 为什么jsonrpc中不用传csrf_token?

因为在使用JSON-RPC协议进行通信时,每个请求都会包含一个特殊的 `session_id` 参数,该参数会随着用户的登录而自动获取。Odoo系统会在用户登录时为其分配一个Session ID,并将其记录在服务器端。因此,在使用JSON-RPC进行通信时,系统可以直接根据 `session_id` 来验证用户身份,无需再使用 `csrf_token` 进行验证。

8. Session是如何存储的?odoo是如何判断Session是否有效的?

在Odoo系统中,Session是以Cookie的形式存储在客户端浏览器中的。当用户第一次访问系统时,系统会生成一个唯一的Session ID,并将其存储在Cookie中。之后,每次用户发送请求时,系统都会检查请求中是否包含有效的Session ID,并根据Session ID查找用户在服务器端存储的Session数据。如果Session数据存在且未过期,则可以认为该Session有效。

系统判断Session是否有效的具体逻辑如下:

- 首先,系统会检查请求中是否包含名为 `session_id` 的参数。
- 如果存在 `session_id`,则系统会尝试将其与服务器端存储的Session数据进行匹配。
- 如果匹配成功,则可以认为Session有效;否则,系统会返回一个错误响应,并要求用户重新登录。

9. 配置文件中的limit_memory_soft和limit_memory_hard区别是什么?

`limit_memory_soft` 和 `limit_memory_hard` 是用于限制Odoo进程内存使用的参数,具体区别如下:

- `limit_memory_soft`:表示Odoo进程在消耗了指定量的内存后,应该开始释放一些不必要的资源以减少内存使用。默认值为64MB。
- `limit_memory_hard`:表示Odoo进程在消耗了指定量的内存后,应该立即停止运行以防止内存泄漏。默认值为268435456(即256MB)。

10. 如何更新系统中全部的模块?其原理是怎样的?

要更新Odoo系统中所有已安装的模块,可以按照以下步骤操作:

- 在命令行中进入Odoo系统的根目录,并执行以下命令:`./odoo-bin -d <database_name> -u all`
- 上述命令将首先停止当前正在运行的Odoo服务,然后重新启动服务,并对所有已安装的模块执行升级操作。

这个命令的原理是通过调用Odoo系统核心代码中的 `load()` 方法来加载所有已安装的模块,并检查它们是否需要更新。如果有更新的模块,则会按照一定的顺序执行更新操作,以确保不会出现依赖关系错误或其他异常情况。更新完成后,系统会自动重启以使更改生效。

高级问题:

  1. Environment对象的作用是什么?
  2. Registry是什么?默认的Registry的LRU大小是多少?
  3. odoo的多workder模式如何开启?单worker和多worker的运行机制有什么不同?

回答3

1. 在odoo中,Environment对象是一个重要的工具,它允许Python代码与数据库进行交互。它提供了一种可扩展的方式来管理和更新数据模型、记录和查询数据库。

2. 在odoo框架中,Registry是一个用于注册和查找模型、视图、服务等的简单存储机制。默认情况下,Registry的LRU大小为10000。
 3. 要启用odoo的多worker模式,可以在启动命令中使用 `--workers` 参数并设置大于1的值。在单worker模式下,所有请求都由一个进程处理;而在多worker模式下,请求会被多个进程同时处理,从而  提高系统的吞吐量。两种模式的主要区别在于处理客户端请求的方式不同,单worker模式只有一个工作线程,而多worker模式下有多个工作线程。

odoo面试问题总结的更多相关文章

  1. 42.Odoo产品分析 (四) – 工具板块(10) – 问卷(2)

    查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (四) – 工具板块(10) – 问卷(1) 4 页面 即问卷,点开一项查看:  可以看出,网页就是问卷本身的子目录,其中指明了该目录包括哪 ...

  2. 23.Odoo产品分析 (三) – 人力资源板块(4) – 招聘流程(1)

    查看Odoo产品分析系列--目录 安装招聘流程模块:  可以看到我们在前面的章节中设置的"生产经理"岗位,和其他的看板视图一样,每一个岗位板块提供了各种便捷的操作入口和颜色设置. ...

  3. Odoo HRMS应用简介

    Odoo HRMS包含行政管理的大部分功能,包含 部门组织架构 员工清册 岗位规划以及招聘管理 用工合同 考勤管理 休假和加班 费用报销 员工考核 绩效.激励.培训成绩 薪资清册     个角色 角色 ...

  4. C++常见笔试面试要点以及常见问题

    1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...

  5. [Java面经] 关于面试的二三事.

    今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...

  6. 在面试中忽然发现DateTime的一些...

    今天说说我面试中碰到的一个小问题,在我问起DateTime为什么无法赋值NULL值,一般第一反应都认为它是值类型,不是引用类型,但随后我查阅了度娘自我学习到它是结构类型,那么随之而然就无法赋值NULL ...

  7. 2016年8月ios面试问题总结

    1.app分发方式 所谓分发方式简单点讲就是你的app都可以通过哪些途径给用户使用. a:个人或者公司的开发者账号 可以上传appStore,用户通过appStore下载. b:企业账号:打包分发. ...

  8. 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮

    (出处:http://www.cnblogs.com/linguanh/) 前序: 距离  2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...

  9. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  10. Android面试经验 -- 乐视

    此次投的是三年经验的Android开发,最后反而因为自己的失误,没有准备充分而导致结果很悲剧,以此告诫自己千万不能疏忽大意. 面试过程 第一次去大公司面试,心里不是一般的激动和紧张,来到乐视大厦门口, ...

随机推荐

  1. 【日常运维笔记】linux系统使用grep命令查找文件,并用vim编辑文件

    问题描述:linux系统中查找含有某个字符的文件,进行编辑修改 1.使用grep命令查找到符合条件的文件 命令格式:grep  '匹配内容'  文件路径  显示方式(-r  -n) -i:忽略大小写进 ...

  2. Paimon merge into 实现原理

    语法 MERGE INTO target USING source ON source.a = target.a WHEN MATCHED THEN UPDATE SET a = source.a, ...

  3. ModuleNotFoundError: No module named '_ctypes' when Python3

    前言 运行 python 报错:ModuleNotFoundError: No module named '_ctypes' when using Value from module multipro ...

  4. linux部署go项目

    直接部署: 1.将程序所需要的文件如配置文件和生成的可执行文件拷贝到linux中 2.直接执行./main命令,启动程序 (main是go编译生成的可执行文件) 如果报Permission denie ...

  5. 通过C#转换图片到PDF文档

    将图片(JPG.PNG)转换为PDF文件可以帮助我们更好地保存和分享图片.此外,PDF文件还具有强大的安全特性,将图片转换为PDF后,我们可以通过设置密码来文件内容不被泄露.本文将介绍如何将JPG/P ...

  6. 告别手动敲代码!VSCODE 风格在线可视化开发平台,效率飙升!

    2025 年 2 月 21 日消息,对于广大开发者而言,今天迎来一则重大利好消息!一款操作布局与 VSCODE 极为相似的可视化开发神器 --Joker 智能可视化开发平台正式上线.无论你是深耕前端领 ...

  7. Cursor 老改坏代码?六哥这几招超管用!

    大家好,我是六哥!最近不少小伙伴和我吐槽,在使用Cursor时,AI老是把代码改坏,让人头疼不已.我自己也用了大几十个小时Cursor,今天就来给大家分享一些实用小窍门,教大家如何巧妙规避这类问题. ...

  8. 【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化

    [Ubuntu]"Linux版PhotoShop"绘图软件的安装和汉化 零.前言 最近换了Linux系统,但是写教程做PPT的时候还是得用到绘图软件,上网一查,总结对比之后发现Kr ...

  9. FastAPI依赖注入作用域与生命周期控制

    title: FastAPI依赖注入作用域与生命周期控制 date: 2025/04/08 00:02:10 updated: 2025/04/08 00:02:10 author: cmdragon ...

  10. java基础之集合(List)、Properties集合

    一.ArrayList集合的方法 1.public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上. 2.public E get(int  ...