核心提示:一切都是对象 OpenERP的所有资源(Resource)都是对象,如 menus, actions, reports, invoices, partners 等等。换言之,在OpenERP中,一个菜单项,一个弹出窗口,其实都是一条数据库记录。
一切都是对象
OpenERP的所有资源(Resource)都是对象,如 menus, actions, reports, invoices, partners 等等。换言之,在OpenERP中,一个菜单项,一个弹出窗口,其实都是一条数据库记录。OpenERP运行时,从数据库读出“菜单项”记录,根据该记录 的信息,在屏幕上显示菜单项及其子菜单项。因此,理论上,可以不写代码,而是直接修改OpenERP的数据库而编写功能菜单、查询窗口、动作按钮等实现业 务功能开发。实际开发中,通常是编写XML文件,导入菜单、窗口、动作等编程元素,实现功能开发。XML文件比直接修改数据库或编写SQL语句更容易使用 一些。
OpenERP通过自身实现的对象关系映射(ORM,object relational mapping of a database)访问数据库。OpenERP的对象名是层次结构的,就是说可以使用"."访问树状对象,如:
· account.invoice : 表示财务凭证对象。
· account.invoice.line : 表示财务凭证对象中的一个明细行对象。
通常,对象名中,第一级是模块名,如: account, stock, sale 等。比之直接用SQL访问数据库,OpenERP的对象的优势有,1)直接使用对象的方法增、删、改数据库记录。因为OpenERP在基类对象中实现了常 规的增、删、改方法,因而,普通对象中不需要写任何方法和代码就具备增、删、改数据库记录的功能。2)对于复杂对象,只需操作一个对象即可访问多张数据 表。如partner对象,它的信息实际上存储在多张数据表中(partner address, categories, events 等等),但只要通过"."操作即可访问所有关联表(如,partner.address.city),简化了数据库访问。
注意,在其他编程语言或开发平台(如Java or JavaEE)中,一个对象(Object)通常和数据库中一条记录(Record)相对应。但是,OpenERP的对象其实是一个Class,它和一个 数据表(Table)对应,而不是和一个记录(Record)对应。在OpenERP中,数据库记录(Record)通常叫资源(Resource)。因 为Object操作的是数据表,OpenERP的对象的方法(Method)中,几乎每个方法都带有参数ids,该参数是资源(Resource or Record)的ID(在OpenERP中ID是主键)列表,通过该ids就可以操作具体的Record了。
访问OpenERP对象
OpenERP提供了三种方式执行对象的方法(Method),每种方式都是先取得对象,然后调用对象的方法。三种方式是,1)直接使用对象,2)通过netservice使用对象,3)通过xmlrpc使用对象。
直接使用对象:这种方式最简单,这种方式只能在OpenERP Server端使用,编写OpenERP的模块时候,通常使用这种方式。这个方式的内部实现原理是,OpenERP加载模块(不是安装,是启动时加载已安 装模块)时,会将创建模块中的对象实例,对象实例以对象名为关键字,存储在对象池(pool)中。此方式是,从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__方法中)将自己提供的服务登记在服务池中,并暴露自己的服务方法(即该 服务可供调用的method)。和对象池不同的是,服务可以有选择性的暴露自己的方法。OpenERP的工作流(Workflow)、报表 (Report)都以服务的形式暴露自己的方法,关于OpenERP可供使用的服务有哪些,将在以后介绍。这个方式调用形式如下:
service = netsvc.LocalService("object_proxy")
result = service.execute(user_id, object_name, method_name, parameters)
第一行指定服务名取得服务,"object_proxy"是osv.osv对象初始化时注册的一个服务,这个服务可用于调用OpenERP的几乎所有对象 (准确的说是所有从osv.osv派生的对象)。"object_proxy"服务用于调用对象的方法。第二行是其调用格式,execute是该服务暴露 的一个服务方法,该方法的参数说明如下:
user_id: 用户id,以用户名、密码登录后取得的id。
object_name: 对象名,欲访问的对象的名称,如"res.patner"等。
method_name: 方法名,欲调用的方法的名称,如"create"等。
parameters: 方法的参数。