基础问题:
- Model和TransientModel区别是什么?什么场景下应该使用TransientModel?
- 字段的compute属性是用来做什么的?如何将包含compute属性的字段的值存储到数据库中?
- 如何创建一个索引字段?
- 如何设置一个字段的默认值?默认值可以是一个函数吗?
- 如何给限定某个字段只能由某个让用户组的人访问?
- 如何将某个字段设置为提权访问(admin)?
- api.model的作用是什么?
- 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}
中级问题:
- 什么是开发者模式?开发者模式中的三种模式的区别是什么?
- models中inherit和inherits的区别是什么?
- Binary字段与附件对象有什么关系?如何更改附件默认存储的位置?
- base模块和web模块分别在系统中扮演什么样的角色?
- 如何将自定义的widget添加到系统中?
- csrf_token是什么?有什么作用?是如何生成的?
- 为什么jsonrpc中不用传csrf_token?
- Session是如何存储的?odoo是如何判断Session是否有效的?
- 配置文件中的limit_memory_soft和limit_memory_hard区别是什么?
- 如何更新系统中全部的模块?其原理是怎样的?
回答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()` 方法来加载所有已安装的模块,并检查它们是否需要更新。如果有更新的模块,则会按照一定的顺序执行更新操作,以确保不会出现依赖关系错误或其他异常情况。更新完成后,系统会自动重启以使更改生效。
高级问题:
- Environment对象的作用是什么?
- Registry是什么?默认的Registry的LRU大小是多少?
- odoo的多workder模式如何开启?单worker和多worker的运行机制有什么不同?
回答3
1. 在odoo中,Environment对象是一个重要的工具,它允许Python代码与数据库进行交互。它提供了一种可扩展的方式来管理和更新数据模型、记录和查询数据库。
2. 在odoo框架中,Registry是一个用于注册和查找模型、视图、服务等的简单存储机制。默认情况下,Registry的LRU大小为10000。
3. 要启用odoo的多worker模式,可以在启动命令中使用 `--workers` 参数并设置大于1的值。在单worker模式下,所有请求都由一个进程处理;而在多worker模式下,请求会被多个进程同时处理,从而 提高系统的吞吐量。两种模式的主要区别在于处理客户端请求的方式不同,单worker模式只有一个工作线程,而多worker模式下有多个工作线程。