跳至内容

深入理解Odoo(OpenERP)的对象(下)

一、一切都是对象

在 OpenERP 里,所有资源(Resource)都是对象,像菜单、动作、报表、发票、业务伙伴等。也就是说,OpenERP 中的一个菜单项、一个弹出窗口等,本质上都是一条数据库记录。OpenERP 运行时,会从数据库读取这些记录,再依据记录信息在屏幕上显示相应元素。理论上,能通过直接修改 OpenERP 的数据库来实现功能开发,例如添加菜单、窗口、动作等。但在实际开发时,通常是编写 XML 文件并导入,以此来定义菜单、窗口、动作等元素,这种方式比直接修改数据库或编写 SQL 语句更便捷。

二、对象的层次结构与优势

OpenERP 的对象名具备层次结构,可使用“.”来访问树状对象。例如:

  • `account.invoice` 代表财务凭证对象。
  • `account.invoice.line` 表示财务凭证中的明细行对象。

一般来说,对象名的第一级是模块名,比如 `account`、`stock`、`sale` 等。和直接使用 SQL 访问数据库相比,OpenERP 的对象有以下优势:

  1. 直接使用对象的方法进行数据库操作:OpenERP 在基类对象中实现了常规的增、删、改方法,所以普通对象无需额外编写方法和代码就能进行数据库记录的操作。
  2. 简化复杂对象的数据库访问:对于复杂对象,只需操作一个对象就能访问多张数据表。例如,`partner` 对象的信息存储在多张数据表中(如 `partner`、`partner_address`、`categories`、`events` 等),但通过“.”操作符(如 `partner.address.city`)就能访问所有关联表,简化了数据库访问。

需要注意的是,在其他编程语言或开发平台(如 Java 或 JavaEE)中,一个对象(Object)通常对应数据库中的一条记录(Record)。然而在 OpenERP 中,对象实际上是一个类(Class),它对应一个数据表(Table),而非一条记录(Record)。数据库记录在 OpenERP 中通常被称为资源(Resource)。由于 OpenERP 的对象操作的是数据表,所以其方法(Method)中几乎每个方法都带有参数 `ids`,该参数是资源(Resource 或 Record)的 ID 列表(在 OpenERP 中,ID 是主键),通过 `ids` 可以操作具体的 Record。

三、访问 OpenERP 对象的方式

OpenERP 提供了三种方式来执行对象的方法(Method),每种方式都是先获取对象,然后调用对象的方法。具体如下:

(一)直接使用对象

这种方式最为简单,仅在 OpenERP Server 端使用,开发 OpenERP 模块时通常采用此方法。其内部实现原理是:OpenERP 在加载模块(启动时加载已安装模块)时,会创建模块中的对象实例,并将这些实例以对象名为关键字存储在对象池(pool)中。调用方式如下:

obj = self.pool.get('name_of_the_object')
obj.name_of_the_method(parameters_for_that_method)    

第一行代码从对象池中获取对象实例,第二行代码调用对象的方法。

(二)通过 Netservice 使用对象

这种方式与直接使用对象类似,但以“服务”(Service)的形式呈现,同样只能在 OpenERP Server 端使用,即调用程序和 OpenERP Server 程序在同一个 Python 虚拟机上运行。其内部实现原理是:OpenERP 有一个全局变量服务池 `SERVICES`(位于 `bin\netsvc.py`),一些对象在创建时(`__init__` 方法中)会将自己提供的服务注册到服务池中,并暴露自己的服务方法。与对象池不同的是,服务可以选择性地暴露自己的方法。OpenERP 的工作流(Workflow)和报表(Report)都以服务的形式暴露自己的方法。调用方式如下:

service = netsvc.LocalService("object_proxy")
result = service.execute(user_id, object_name, method_name, parameters)    

第一行指定服务名获取服务,`"object_proxy"` 是 `osv.osv` 对象初始化时注册的一个服务,可用于调用 OpenERP 的几乎所有对象(准确地说是所有从 `osv.osv` 派生的对象)的方法。第二行是其调用格式,`execute` 是该服务暴露的一个服务方法,其参数说明如下:

  • `user_id`:用户 ID,通过用户名和密码登录后获取的 ID。
  • `object_name`:对象名,欲访问的对象的名称,如 `"res.partner"` 等。
  • `method_name`:方法名,欲调用的方法的名称,如 `"create"` 等。
  • `parameters`:方法的参数

深入理解Odoo(OpenERP)的对象(下)
6776, Administrator 2011年8月10日
标签
存档