深入理解对象(转载)

原文地址:
http://shine-it.net/index.php/topic,2159.0.htmlhttp://blog.sina.com.cn/s/blog_57ded94e01014pmk.html

一切都是对象
    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: 方法的参数。

XML−RPC方式:这个方式相当灵活,它以HTTP协议远程访问对象,因此,能在本机、局域网、广域网范围调用OpenERP的对象的方法。该方式的调用形式是:
sock = xmlrpclib.ServerProxy('http://server_address:port_number/xmlrpc/object')
result = sock.execute(user_id, password, object_name, method_name, parameters)
参数说明如下:
server_address: 运行OpenERP Server的机器的IP或域名。
port_number: OpenERP Server的xmlrpc调用端口,缺省情况是8069。
execute的参数和Netservice方式相同,只是多了个password参数,该参数即用户的登录密码。

XML-RPC方式参考例子。这个例子以xmlrpc方式调用OpenERP的对象res.partner,在数据库中插入一条业务伙伴及其联系地址记录。因为含有中文,测试时注意代码文件保存成utf-8格式:

# -*- encoding: utf-8 -*-
import xmlrpclib #导入xmlrpc库,这个库是python的标准库。
username ='admin' #用户登录名
pwd = '' #用户的登录密码,测试时请换成自己的密码
dbname = 'case1' #数据库帐套名,测试时请换成自己的帐套名
# 第一步,取得uid
sock_common = xmlrpclib.ServerProxy ('http://localhost:8069/xmlrpc/common')
uid = sock_common.login(dbname, username, pwd)
#replace localhost with the address of the server
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object') # 调用res.partner对象的create方法在数据库中插入一个业务伙伴
partner = {
'name': 'shine-it',
'lang': 'zh_CN',
}
partner_id = sock.execute(dbname, uid, pwd, 'res.partner', 'create', partner) # 下面再创建业务伙伴的联系地址记录
address = {
'partner_id': partner_id,
'type' : 'default',
'street': '浦东大道400号',
'zip': '',
'city': '上海市',
'phone': '021-88888888',
}
address_id = sock.execute(dbname, uid, pwd, 'res.partner.address', 'create', address)
再议OpenERP的对象
在《OpenERP应用和开发基础》的第一章中提过OpenERP的架构如下图所示:

这个架构图中,Server端的Business Object就是这里重点解说的内容。通过上面的解说,可以这样通俗的理解OpenERP的对象:
每个对象就是一个代码块,包含了数据表操作(增删改查)的代码。OpenERP Server好比是一个代码池,里面装满了代码块。通过对象池、服务池、xmlrpc等方式,可以取得代码块位置(或者专业一点,叫指针),然后调用代码块的方法,操作数据库。对象的代码什么时候装入“代码池”呢?每个对象定义的后面都有一行:name_of_the_object(),这一行实际上是创建对象实例,实例创建好以后就装到了代码池,这个装入的过程在对象的基类(osv.osv)中完成。对象的基类(osv.osv)已实现了增删改查等常规数据表操作方法,因此,只要定义好对象的字段,即使不写任何代码,该对象已经具备增删改查数据表的能力。

openerp经典收藏 深入理解对象(转载)的更多相关文章

  1. openerp经典收藏 深入理解报表运行机制(转载)

    深入理解报表运行机制 原文:http://blog.sina.com.cn/s/blog_57ded94e01014ppd.html 1) OpenERP报表的基本运行机制    OpenERP报表的 ...

  2. openerp经典收藏 深入理解工作流(Workflow)(转载)

    深入理解工作流(Workflow) 原文:http://shine-it.net/index.php/topic,2494.0.html 一.工作流定义:<?xml version=" ...

  3. openerp经典收藏 对象定义详解(转载)

    对象定义详解 原文地址:http://shine-it.net/index.php/topic,2159.0.htmlhttp://blog.sina.com.cn/s/blog_57ded94e01 ...

  4. openerp经典收藏 对象的预定义方法(转载)

    对象的预定义方法 原文:http://shine-it.net/index.php/topic,2159.15.html 每个OpenERP的对象都有一些预定义方法,这些方法定义在基类osv.osv中 ...

  5. openerp 经典收藏 记录规则 – 销售只能看到自己的客户,经理可以看到全部(转载)

    记录规则 – 销售只能看到自己的客户,经理可以看到全部 原文地址:http://cn.openerp.cn/record_rule/ OpenERP中的权限管理有四个层次: 菜单级别: 即,不属于指定 ...

  6. openerp 经典收藏 Openerp开发进销存系统完毕总结(转载)

    原文地址:http://blog.csdn.net/heartrude/article/details/9142463 Openerp开发进销存系统完毕总结 分类: 代码历程 OpenERP 工程思想 ...

  7. openerp经典收藏 字段定义详解(转载)

    字段定义详解 原文地址:http://shine-it.net/index.php/topic,2159.0.htmlhttp://blog.sina.com.cn/s/blog_57ded94e01 ...

  8. openerp 经典收藏 workflow中的‘非典型’自动触发器trigger_model(转载)

    workflow中的‘非典型’自动触发器trigger_model 原文:http://cn.openerp.cn/workflow%E4%B8%AD%E7%9A%84%E9%9D%9E%E5%85% ...

  9. openerp 经典收藏 通过view实现字段的只读、隐藏操作(转载)

    通过view实现字段的只读.隐藏操作 原文地址:http://cn.openerp.cn/view_groups/ 在OpenERP V7视图(ir.ui.view)多了一个非常有用的字段(group ...

随机推荐

  1. 【阿里云产品公测】OpenSearch初探

    作者:阿里云用户 yqzzzz 这两天在折腾站内搜索,下午照例上阿里云网站看看ECS,OSS情况,恰巧看到免费公测的活动,咦,OpenSearch,看起来这不就是我要找的东西么!  1分钟时间填完申请 ...

  2. CNZZ每天百亿条日志写入,SLS+ODPS轻松拆招

    如果你是一个站长,想要提交一个查询,从一亿多条日志中找出从湖南省发出.使用ISP电信.通过百度搜索跳转到达的访问日志.该怎么做? 别急,在接收到您的查询条件后,CNZZ可以快速通过SLS(简单日志服务 ...

  3. Hadoop学习笔记(1) ——菜鸟入门

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

  4. OC之property和自动释放池

    property实例 property参数 自动释放池 一.property实例 1.前边的例子我们看到,我们在一个类中如果用到另外一个类的实例作为自己的成员变量时,通常需要在setter方法中,先r ...

  5. 10个实用的但偏执的Java编程技术

    在沉浸于编码一段时间以后,你会渐渐对这些东西习以为常.因为,你知道的-- 任何事情有可能出错,没错,的确如此. 这就是为什么我们要采用"防御性编程",即一些偏执习惯的原因.下面是我 ...

  6. 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。

    简要教程 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. c ...

  7. hust 1017 DLX

    #include<set> #include<cmath> #include<queue> #include<cstdio> #include<v ...

  8. photoSlider-原生js移动开发轮播图、相册滑动插件

    详细内容请点击 在线预览   立即下载 使用方法: 分别引用css文件和js文件 如: <link rel="stylesheet" type="text/css& ...

  9. A*算法的实现

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  10. 【学习笔记】【C语言】标识符

    1. 什么是标识符 标识符就是在程序中自定义的一些符号和名称.要跟关键字区分开来:关键字是C语言默认提供的符号,标识符是程序员自定义的 2. 标识符的作用 1) 标识符,从字面上理解就是用来标识某些东 ...