了解 Odoo 在从启动到用户打开一个模型表单视图时,内部到底发生了什么,是模块开发、性能调优和故障排查的关键。本文将为你系统梳理 Odoo 18 的执行流程与关键方法调用链,适用于开发者与技术架构师快速理解 Odoo 核心机制。
概念 | 说明 |
---|---|
Action | Odoo 前端与后端交互的动作定义,决定打开什么视图、加载哪些数据 |
View | 视图,定义界面布局(如表单、列表、看板等) |
Model | 数据模型,继承自 models.Model ,对应数据库表 |
Field | 字段,模型的数据结构定义 |
Controller | 控制器,处理 HTTP 路由请求 |
Service | 前端服务,管理 action、数据加载、界面跳转等 |
在运行 odoo-bin
启动命令后,Odoo 会执行一系列初始化步骤,为后续操作打下基础:
阶段 | 动作 |
---|---|
配置加载 | 解析 odoo.conf 配置项(数据库连接、模块路径等) |
模块扫描 | 扫描 addons_path 下的所有模块,加载 __manifest__.py |
注册模型 | 加载模型、控制器、视图、安全规则等 |
数据库连接 | 初始化与 PostgreSQL 的连接,执行模块更新(若指定) |
Web 服务启动 | 使用 werkzeug 启动 HTTP 服务,注册 /web 等路由 |
假设用户点击"客户"菜单项,打开 res.partner
的表单视图,大致会经历以下流程:
[用户点击菜单]
→ [前端触发 web.action.load 请求]
→ [后端加载 action & view 定义]
→ [前端渲染组件结构]
→ [前端调用 model.read 获取记录数据]
→ [渲染表单页面,等待用户交互]
路由 | 功能 |
---|---|
/web/action/load |
加载 action 和视图结构 |
/web/dataset/call_kw |
调用模型方法(如 read、write)加载记录数据 |
/web/view/view_load |
异步加载视图组件(仅特殊情况) |
以下是从 action 加载到表单渲染,后端执行的关键 Python 方法链:
模块 | 方法 |
---|---|
odoo/addons/web/controllers/main.py |
action_load() :响应前端加载 action 请求 |
odoo/models.py |
fields_view_get() :获取表单结构(arch + fields) |
odoo/addons/base/models/ir_actions.py |
read() :加载 ir.actions.act_window |
模块 | 方法 |
---|---|
odoo/models.py |
read() :读取记录数据 |
odoo/models.py |
check_access_rights() / check_access_rule() :权限校验 |
odoo/fields.py |
convert_to_read() :字段值格式转换(如 Many2one 展示 name) |
Odoo 18 基于 OWL(Odoo Web Library) 框架实现前端渲染,其组件化结构如下:
组件 | 作用 |
---|---|
FormController |
控制表单的交互逻辑,如保存、取消等 |
FormRenderer |
渲染表单字段布局与内容 |
FieldWidget |
渲染具体字段(如 Text、Many2one、Date 等) |
ActionService |
管理 action 调用及视图渲染 |
onWillStart
、onWillUpdateProps
、onWillUnmount
等,便于资源管理和异步加载。FieldWidget
实现自定义字段渲染,注册新类型。action_service.js
、form_renderer.js
代码流。当用户填写完表单并点击"保存"按钮时:
触发 /web/dataset/call_kw
,方法为 write
(更新)或 create
(新增)
后端进入 models.py → write()
或 create()
方法
同时执行:
@api.onchange
(界面联动)@api.constrains
(校验约束)@api.depends
(计算字段)保存成功后,界面刷新或跳转到指定动作。
@api.depends
,避免循环依赖。logging_level=debug_sql
分析慢查询,添加索引。@tools.ormcache
)。fields_view_get()
返回的 arch 是否包含该字段readonly
、invisible
属性check_access_rights()
、check_access_rule()
调用栈ir.model.access.csv
配置位置 | 用途 |
---|---|
models.py → fields_view_get() |
查看视图加载结构 |
models.py → read() |
检查记录数据加载 |
ir_actions.py → read() |
分析 action 行为 |
ir_ui_view.py → _get_view_arch() |
检查视图 XML 定义 |
文件 | 功能 |
---|---|
action_service.js |
请求 action 执行入口 |
form_controller.js |
表单行为控制,如保存、返回等 |
form_renderer.js |
字段渲染实现 |
dataset.js |
封装的 RPC 调用逻辑,调用 call_kw |
随着 AI 技术发展,Odoo 可集成智能助手、自动表单填写、自然语言报表生成等能力。例如:
理解 Odoo 的完整执行流程是模块开发的基础,也是性能调优与 bug 排查的核心。掌握每个阶段调用的方法、参与的模块与执行顺序,能帮助你更高效地开发业务逻辑、扩展功能或处理视图问题。
如果你正在开发自定义模块、设计低代码平台或嵌入 AI 能力(如自然语言控制 Odoo 模块),也欢迎进一步交流!
如果你需要此博客的 Markdown、PDF、或直接发布到 CSDN/博客园/知乎的格式版本,我也可以帮你生成。是否需要?
步骤 | 模块/路径 | 关键方法 |
---|---|---|
加载配置 | odoo/tools/config.py |
config.parse_config() |
启动服务 | odoo/cli/server.py |
start() |
加载模块 | odoo/modules/registry.py |
Registry.load() / load_modules() |
启动 Web | odoo/service/server.py |
start_wsgi_server() |
加载视图/模型 | odoo/addons/base/models/ir_model.py ir_model_fields , ir_ui_view 等 |
init() , fields_view_get() |
步骤 | 路由/模块 | 关键方法 |
---|---|---|
前端发送请求 | /web/action/load |
JS:ActionService.prototype.loadAction() |
控制器处理 | odoo/addons/web/controllers/main.py |
Home.action_load() |
加载 action | odoo/addons/base/models/ir_actions.py |
read() |
加载视图 | odoo/models.py |
fields_view_get() (解析 XML 为 arch) |
视图解析器 | odoo/tools/view_validation.py |
_validate_form_view() |
步骤 | 路由/模块 | 关键方法 |
---|---|---|
前端接收视图结构 | JS:FormRenderer , FormController |
setup() , onWillStart() |
组件渲染 | OWL 模板系统 | useComponent , useSubEnv |
步骤 | 路由/模块 | 关键方法 |
---|---|---|
请求记录数据 | /web/dataset/call_kw |
method=read |
ORM 调用 | odoo/models.py |
read() , _read() |
权限校验 | odoo/models.py |
check_access_rights() , check_access_rule() |
字段转换 | odoo/fields.py |
convert_to_read() |
步骤 | 路由/模块 | 关键方法 |
---|---|---|
保存记录 | /web/dataset/call_kw |
method=write or create |
ORM 调用 | odoo/models.py |
write() , create() , unlink() |
校验与约束 | @api.constrains , @api.onchange |
自定义模型方法 |
触发计算字段 | @api.depends() |
被依赖字段变动后自动触发 |
web_client.js → action_service.js → web.action.load
ir.actions.act_window → ir.ui.view → fields_view_get
arch
, fields
, toolbar
, buttons
FormRenderer
, FieldWidgets
, ControlPanel
dataset.call_kw → model.read
useState
, patch
, mount
位置 | 用途 |
---|---|
models.py → fields_view_get() |
追踪视图定义加载 |
ir_actions.py → read() |
查看 action 内容 |
models.py → read()/write() |
数据加载/保存核心点 |
base/ir_ui_view.py → _get_view_arch() |
检查自定义表单 XML |
dataset.js → call_kw() |
前端调试 RPC 请求 |
理解 Odoo 的完整执行流程是模块开发的基础,也是性能调优与 bug 排查的核心。掌握每个阶段调用的方法、参与的模块与执行顺序,能帮助你更高效地开发业务逻辑、扩展功能或处理视图问题。
如果你正在开发自定义模块、设计低代码平台或嵌入 AI 能力(如自然语言控制 Odoo 模块),也欢迎进一步交流!