定义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  中预定义的字段如下:

_auto

定义是否由PostgreSQL自动生成表,当对象从数据库视图读取时候,设置为 False 是很有用的。请参考“从PostgreSQL生成报表”。

  

_columns (required)

对象的字段名。

 

_constraints

对象的约束。

 

_sql_constraints

对象的 SQL 约束。

 

_defaults

对象的某些字段的缺省值定义。

 

_inherit

定义当前对象从 osv 对象继承的名字。

 

_inherits

从 osv 对象类中继承的属性列(多重继承),如:{'name_of_the_parent_object': 'name_of_the_field', ...},缺省值为{}。

 

_log_access

定义是否做写日志,如 True, 则 表中自动加:create_uid(创建者id), create_date(创建日期), write_uid(修改者id), write_date(修改日期)。

 

_name (required)

对象的名称。

 

_order

列名称,排序结果,缺省值为: id 。

 

_order = "name"
_order = "date_order desc"
_rec_name

资源保存名称,缺省值为 'name'。注意:方法 name_get 简单的返回本自动的内容。

 

_sequence

定义产生唯一记录ID 的序列,缺省值:空

 

_sql

当 _auto=Ture 时,在数据库中创建对象(表)之后运行的 SQL 命令。

 

_table

表名称,缺省值为 :  _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), 因为子类复制了父类的所有字段,子类可充当父类。

 

《---续---》

 

你可能感兴趣的:(对象)