定义OE的对象-字段跟方法(1)
OpenERP 对象
所有ERP的数据通过对象进行访问,如:有一个 res.partner 对象 要访问 合作伙伴们(partners),一个账户.发票(account.invoice )的发票相关数据,等等。
请注意每种类型的资源都有一个对象。我们使用 res.partner 对象来管理所有的合作伙伴而不是每个对象自己管理自己。当我们谈到 "面向对象"这个词时指的是高度抽象的对象。
所有对象的方法都有一个参数 “ids”,它指定了本方法必须应用哪个资源(如哪个伙伴),精确的说本参数包含了方法要使用的某种资源的id列表,如有二个伙伴其ID分别为 1, 5 ,我们要调用 res_partner 对象的 send_email 方法, 可这样来调用:
res_partner.send_email(... , [1, 5], ...)
在本文的后面会有跟精确的语法调用说明。
下面介绍如何定义一个新的对象,用不同的方式定义对象。对开发者:
-
OpenERP "对象" 在面向对象的程序设计中通常称为类。
-
A OpenERP "资源" 在面向对象程序设计中统称为对象。
在OE中编程,由于使用 python语言这会有一点而混乱 如 python 有对象、实例....。幸运的 OE的资源使用 pythone的 browse 方法可转换为 python 对象。
关于 ORM -模型
OE的中心部分为 ORM 即 对象关系映射。OE中,数据模型用 python 的类来描述和加工,用 ORM为开发者提供尽可能无裂纹和透明的关系数据库访问(PostgreSQL), 也提供对象的持久化操作。
OpenERP的对象属性
要python定义一个新的对象,先定义一个 python 类,然后实例化类,类必须 继承 osv 类,osv类在 osv模块中。
按如下方式定义类:
class name_of_the_object(osv.osv):
_name = 'name.of.the.object'
_columns = { ... }
...
name_of_the_object()
在类中要声明(定义)一些字段,其中 _name 和 _columns 二个字段是必须的,其他可选,osv 中预定义的字段如下:
定义是否由PostgreSQL自动生成表,当对象从数据库视图读取时候,设置为 False 是很有用的。请参考“从PostgreSQL生成报表”。
对象的字段名。
对象的约束。
对象的 SQL 约束。
对象的某些字段的缺省值定义。
定义当前对象从 osv 对象继承的名字。
从 osv 对象类中继承的属性列(多重继承),如:{'name_of_the_parent_object': 'name_of_the_field', ...},缺省值为{}。
定义是否做写日志,如 True, 则 表中自动加:create_uid(创建者id), create_date(创建日期), write_uid(修改者id), write_date(修改日期)。
对象的名称。
列名称,排序结果,缺省值为: id 。
_order = "name"
_order = "date_order desc"
资源保存名称,缺省值为 'name'。注意:方法 name_get 简单的返回本自动的内容。
定义产生唯一记录ID 的序列,缺省值:空
当 _auto=Ture 时,在数据库中创建对象(表)之后运行的 SQL 命令。
表名称,缺省值为 : _name 字段定义值,将 点 替换为 下划线 后的字符串作为表名称。
对象继承 _inherit
对象可从指定的模块获得继承,要增加、修改一些字段可用继承方式,代码如下:
_inherit='object.name'
对象的扩展:
有二个方式来实现本方式继承,二种方式都会导致新类的对象,他具有父类的字段、方法外,增加了自己的字段和方法。注意: _name 值的不同。
示例 1: ( _name == _inherit )
class custom_material(osv.osv):
_name = 'network.material'
_inherit = 'network.material'
_columns = {
'manuf_warranty': fields.boolean('Manufacturer warranty?'),
}
_defaults = {
'manuf_warranty': lambda *a: False,
}
custom_material()
本例中 custom_material 对象 加了 字段 manuf_warranty 到对象 network.material,即:在 本类的新实例中 , manuf_warranty 字段 可通过父类 访问。 在OO 中本继承称 类继承,子类继承了父类的字段和方法。
示例 2: ( _name = 'other.material)
class other_material(osv.osv):
_name = 'other.material'
_inherit = 'network.material'
_columns = {
'manuf_warranty': fields.boolean('Manufacturer warranty?'),
}
_defaults = {
'manuf_warranty': lambda *a: False,
}
other_material()
本例中,other_material 拥有 network.material 的所有字段,同时也定义了一个新的字段 manuf_warranty。这些字段将作为表 other.material 的字段。父类不能访问子类的属性和方法。
本方式继承称为“原型继承”(e.g. Javascript), 因为子类复制了父类的所有字段,子类可充当父类。
《---续---》