class tiny_object(osv.osv)
_name = 'tiny.object'
_table = 'tiny_object'
_inherits = {
'tiny.object_a': 'object_a_id',
'tiny.object_b': 'object_b_id',
... ,
'tiny.object_n': 'object_n_id'
}
(...)
Objects, Fields and Methods
OpenERP Objects(OpenERP对象)
所有的ERP的数据文件片是通过“Object”访问的。例如,有一个res.partner 的对象访问partners的数据,一个account.invoice对象访问发票的数据,等等。
请注意是一个对象对应资源的每个类型,而不是一个对象对应一个资源。我们使用一个res.partner对象管理所有的partners,而不是一个res.partner对象对应一个partner。如果我们说到“对象导向的”条目,也可以说成每级有一个对象。
直接的影响是对象的所有成员有一个共同参数:“ids”参数。其指定了方法匹配的资源。准确地说,这个参数包含了一列资源标示符(ids,这个方法必须匹配)。
例如,如果有两个id为1和5的partners,我们想调用res_partner 方法“send_mail”,写法如下:
res_partner.send_email(..., [1,5], ...)
下面具体讨论对象方法调用的正确语法。
在接下来的章节中,将介绍如何定义一个新的对象。之后介绍几个定义新对象的方法。
对于开发者:
- OpenERP“对象”是面向对象编程的类
- 一个OpenERP “资源” 通常叫做OO编程的对象,即一个类的实例
在OpenERP中开发时,通常有点混乱,因为是用Python开发,并且Python是一个全部对象导向的语言,并有对象和实例。
幸运地是,一个OpenERP的“resource”可以魔术般地转为一个Python对象,使用“browse”类方法(OpenERP的对象方法)
The ORM - Object-relational mapping - Models
ORM,简短地说是对象关系映射,是OpenERP的核心部分。
在OpenERP中,数据模型是通过Python类和对象描述和操作。缩小Python和底层关系型数据库(PostgreSQL支持对象的持久化)的差距是ORM的工作。
OpenERP Object Attributes(OpenERP的对象属性)
Objects Introduction(对象介绍)
为定义一个新对象,必须定义一个新的Python类并稍后实例化。这个类必须继承osv模块的osv类。
Object definition(对象定义)
对象定义的第一行如下:
class name_of_the_object(osv.osv):
_name = 'name.of.the.object'
_columns = { ... }
...
name_of_the_object()
通过在类中使用预定义名字定义一些字段定义一个对象。这两个是必须的(_name和_colums),其它的是可选的。预定义字段如下:
Predefined fields(预定义字段)
_auto
_columns (必选)
对象字段。详情见fields 部分
_constraints(常量)
对象的常量。
_sql_constraints
对象的SQL常量
_defaults
对象字段的一些默认值
_inherit(继承)
当前对象继承的osv.object的名字
_name(必须)
对象名字,默认为none
_order
用于排序搜查和读取方法的字段名字
默认值:id
例子:
_order = "name"
_order = "date_order desc"
_rec_name
每个资源名存储的字段名。默认值:name。注意,一般地 name_get方法简单地返回这个字段的内容
_sql
对象创建上执行的SQL代码(仅当_auto是true)。意味着创建表后执行代码
_table
SQL表名字。默认值:_name字段值
_auto
将决定根据对象,其对应的PostgreSQL表是否必须自动创建。设置其为False,在从PostgreSQL视图中创建OpenERP对象的情况是很有用的。
_inherits
对象继承的osv对象列表。这个列表必须按照Python列表格式给出({'name_of_the_parent_object': 'name_of_the_field', ...})。
_log_access
决定访问资源是否需要记录。如果需要,在SQL表中将创建四个字段:create_uid, create_date, write_uid, write_date.。那些字段代表了创建这个记录的用户id,记录的创建日期,最后一次修改记录的用户id,和最后一次修改的时间。通过perm_read方法获取。
Object Inhritance- _inherit
介绍
对象可以在一些或者特定的模块中继承。最好通过继承来天机或修改一些字段
其是这样做的:
_inherit = 'object.name'
对象扩展
有两种方式来做这种继承。虽然两种方式作用于数据的新类上,其既有父类的属性和方法还有额外的属性和字段,但是它们引起的结果差距很大。
例子1 创建了一个新的类"custom_material",可能被一个视图或者树形看见或者使用,其将处理“network.material”
这是源于表(other.material),新的子类要操作的表,将从不被前面的"network.material"的视图或者树注意到
例子1 :
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()
注意:
_name = _inherit
在这个例子中,custom_material将给'network.material'对象添加一个新的字段'manuf_warranty。这个类的新的实例通过视图或者树形操作超类表“network material”可见。
inheriency在面向对象设计中通常叫做类继承。儿子继承了父类的字段和行为。
例子 2:
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()
注意:这里name 不等于继承的
在这个例子中,other_material将持有network.material指定的所有字段,并且它将额外持有一个新的字段“'manuf_warranty'”。所有的那些字段将是表'other.material'的一部分。这个类的新的实例在通过视图或者树形操作超类表“network.material”时将是不可见。
这类继承叫做inheritance by prototyping。因为新创建的类复制了指定父类的所有字段。子类继承了父类的数据和行为。
Inheritance by Delegation --_inherits(委托继承)
语法:
class tiny_object(osv.osv)
_name = 'tiny.object'
_table = 'tiny_object'
_inherits = {
'tiny.object_a': 'object_a_id',
'tiny.object_b': 'object_b_id',
... ,
'tiny.object_n': 'object_n_id'
}
(...)
对象tiny_object从inherits中继承了所有的字段和方法
为了从多个表中继承,会给每个继承的对象向tiny_object表添加一列。这列将存储一个外键(另一张表的id)。object_a_id,object_b_id等是String类型并且定义了列的标题,来自tiny.object_a,tiny.object_b等等的外键保存在这列中。
这个继承机制通常叫做instance inheritance " 或者 " value inheritance 。一个资源(实例)有其合作者的VALUES。
字段介绍