第一章:架构概览
多层应用
Odoo采用多层架构,这意味着表现层、业务逻辑层和数据存储层彼此分离。更准确地说,它采用三层架构(图片来自Wikipedia):
表现层由HTML5、JavaScript和CSS共同组成。逻辑层完全使用Python编写,而数据层只支持PostgreSQL作为关系型数据库管理系统(RDBMS)。
根据模块涉及的范围,Odoo开发可以发生在上述任意一层。因此,在继续学习之前,如果你对这些主题还没有达到中等水平,最好先复习一下相关知识。
为了完成本教程,你需要具备非常基础的HTML知识和中等水平的Python知识。高级主题还需要你掌握更多其他领域的知识。网上有许多可以免费学习的教程,但由于每个人的基础不同,我们无法特别推荐其中某一个。
作为参考,这里是Python的官方教程。
注意
从15.0版本开始,Odoo正在积极转向使用其内部开发的OWL框架,将其作为表现层的一部分。旧版JavaScript框架仍然受到支持,但会随着时间推移逐步弃用。高级主题中会进一步讨论这一点。
Odoo模块
服务器端和客户端扩展都被打包成模块,并可以选择加载到某个数据库中。一个模块是一组围绕单一目标组织起来的功能和数据。
Odoo模块既可以向Odoo系统增加全新的业务逻辑,也可以修改和扩展已有业务逻辑。例如,可以创建一个模块,为Odoo的通用会计支持增加你所在国家或地区的会计规则;也可以创建另一个模块,增加公交车队的实时可视化功能。
Odoo中的一切都始于模块,也终于模块。
术语说明:开发者把业务功能组织在Odoo的模块中。主要面向最终用户的模块会被标记并展示为应用(Apps),但大多数模块并不是应用。模块也可以称为addons,Odoo服务器查找这些模块的目录共同组成 addons_path。
模块的组成
一个Odoo模块可以包含以下多种元素:
- 业务对象
-
业务对象(例如一张发票)被声明为一个Python类。得益于对象关系映射(ORM)层,这些类中定义的字段会自动映射到数据库列。
- 对象视图
-
定义用户界面的显示方式。
- 数据文件
-
用于声明模型数据的XML或CSV文件,包括:
- Web控制器
-
处理来自Web浏览器的请求。
- 静态Web数据
-
Web界面或网站使用的图片、CSS或JavaScript文件。
上述元素都不是强制要求。有些模块可能只添加数据文件(例如某个国家或地区特有的会计配置),另一些模块可能只添加业务对象。在本次培训中,我们将创建业务对象、对象视图和数据文件。
模块结构
每个模块都是某个模块目录中的一个目录。模块目录通过--addons-path选项指定。
Odoo模块通过它的清单文件(manifest)进行声明。
当Odoo模块包含业务对象(也就是Python文件)时,这些文件会被组织成一个带有 __init__.py文件的Python包。该文件包含对模块中各个Python文件的导入指令。
下面是一个简化的模块目录:
module
├── models
│ ├── *.py
│ └── __init__.py
├── data
│ └── *.xml
├── __init__.py
└── __manifest__.py
Odoo版本
Odoo提供两个版本:Odoo企业版(采用许可授权和共享源代码)与Odoo社区版(开源)。除了技术支持或升级等服务以外,企业版还为Odoo提供额外功能。从技术角度来看,这些功能只是安装在社区版所提供模块之上的新模块。
准备好开始了吗?现在是时候编写你自己的应用了!
官方原文:Odoo 18 Server Framework 101 · Chapter 1: Architecture Overview
老赵解读
这一章看起来只是架构介绍,其实给后续学习划出了三条主线:浏览器中的页面与交互、Python中的业务规则,以及PostgreSQL中的业务数据。初学者经常把Odoo开发等同于“Python加XML”,但XML更多是在描述界面和数据,真正稳定的业务中心仍然是模型与ORM。
“一切始于模块,也终于模块”尤其重要。Odoo不是让我们修改一套巨大的核心代码,而是通过模块增加、组合和覆盖能力。做客户项目时,优先继承已有模型和视图,不复制原模块,也不直接改Odoo核心源码,后续升级成本会低很多。
最后要区分模块与应用:application=True的模块会作为应用出现在应用列表中,但大量基础组件、桥接模块和技术扩展都应保持为普通模块。看不到应用图标,不代表模块没有安装或没有生效。