可选属性:
下面详细解说各个属性。
是否自动创建对象对应的 Table,缺省值为: True。当安装或升级模块时,OpenERP 会自动在 数据库中为模块中定义的每个对象创建相应的 Table。当这个属性设为 False 时,OpenERP不会自动创建 Table,这通常表示数据库表已经存在。
例如,当对象是从数据库视图(View)中读取数据时, 通常设为 False。当_auto 的值为“False"时,OE 不会自动在数据库中创建相应的表,开发者可以在对 应类的 init()方法中定义表或视图的 SQL。这一般应用在报表所对应的数据对象中,因为报表的数据 对象往往是“视图”,所以我们可以在 init()方法中创建所需的数据库视图 SQL 即可。
定义对象的字段,系统会字段为这里定义的每个字段在数据库表中创建相应的字段。关于字段(Fields)的定义,参见后文。
定义于对象上的约束(constraints),通常是定义一个检查函数,关于约束的详细说明, 参见后文。
_constraints 可以灵活定义 OpenERP 对象的约束条件,当创建或更新记录时,会触发该条件,如 果条件不符合,则弹出错误信息,拒绝修改。
_constraints 的定义格式:
[(method, 'error message', list_of_field_names), ...]
def _name_of_the_method(self, cr, uid, ids): −> True|False
_constraints 的例子:
def _constraint_sum(self, cr, uid, ids):
cr.execute('SELECT a.currency_id
FROM account_move m, account_move_line l, account_account a
WHERE m.id=l.move_id AND l.account_id=a.id AND m.id IN ('+','.join(map(str, ids))+')
GROUP BY a.currency_id')
if len(cr.fetchall()) >= 2:
return True
cr.execute('SELECT abs(SUM(l.amount))
FROM account_move m LEFT JOIN account_move_line l ON (m.id=l.move_id)
WHERE m.id IN ('+','.join(map(str, ids))+')')
res = cr.fetchone()[0]
return res < 0.01
_constraints = [
(_constraint_sum, 'Error: the sum of all amounts should be zero.', ['name'])
]
定义字段的缺省值。当创建一条新记录(record or resource)时,记录中各字段的缺省值 在此定义。
_defaults 属性用于定义字段的缺省值,其格式为:
_defaults:
{
'name_of_the_field':function, ...
}
function 的返回值作为'name_of_the_field'字段的缺省值。function 格式是:function(obj, cr, uid, context),返回值必须是简单类型,如 boolean, integer, string 等。下面是_defaults 的例子。
_defaults = {
'date_order': lambda *a: time.strftime('%Y−%m−%d'),
'state': lambda *a: 'draft',
'user_id': lambda obj, cr, uid, context: uid
}
lambda 是 Python 的行函数,"lambda obj, cr, uid, context: uid"等同于下述函数: def func(obj, cr, uid, context): return uid
在 V6 中字典的值可以不是函数,就比如在 V5 中我们必须这样来定义:_defaults= { 'state' : lambda *a: 'draft'} 而在 V6 中可以这样来:_defaults = {'state' : 'draft'}
另外一个例子: 设置默认图片
file: object.py
def _get_default_image(self, cr, uid, context=None):
image_path = get_module_resource('it', 'static/description/', 'default_image_equipment.png')
return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64'))
_defaults = {
'pin': _get_pin,
'image': _get_default_image,
}
对象说明性文字,任意文字。
是否自动在对应的数据表中增加 create_uid, create_date, write_uid, write_date 四个字 段,缺省值为 True,即字段增加。这四个字段分布记录 record 的创建人,创建日期,修改人,修改 日期。这四个字段值可以 用对象的方法(perm_read)读取。
对象的唯一标识符,必须是全局唯一。这个标识符用于存取对象,其格式通常是 "ModuleName.ClassName",对应的,系统会字段创建数据库表"ModuleName_ClassName"。
定义 search()
和read()
方法的结果记录的排序规则,和 SQL 语句中的 order 类似,缺省值是 id,即按 id 升序排序。详细说明参见后文。
_order 在对象的 search 或 read 方法中的 select 语句上加上"Order"子句,如 _order = 'name desc, account_id',对应 SQL 文的 Order 子句:order by name desc, account_id。
参考:
标识 record name 的字段。缺省情况(name_get 没被重载的话)方法 name_get()返回 本字段值。_rec_name 通常用于记录的显示,例如,销售订 单中包含业务伙伴,当在销售订单上显 示业务伙伴时,系统缺省的是显示业务伙伴记录的_rec_name。
宋教授讲解
数据库表的id字段的序列采集器,缺省值为: None。OpenERP 创建数据库表时,会自 动增加 id 字段作为主键,并自动为该表创建一个序列(名字通常是“表名_id_seq”)作为 id 字段值的 采集器。如果想使用数据库中已有的序列器,则在此处定义序列器名。
定义于对象上的约束(constraints),和 SQL 文中的约束类似。
_sql_constraints 定义数据表的约束条件,其格式如下例所示
_sql_constraints = [
('code_company_uniq', 'unique (code,company_id)', 'The code of the account must be unique per company !')
]
本例的_sql_constraints 会在数据表中增加下述约束:
CONSTRAINT ObjectName_code_company_uniq UNIQUE(code, company_id)
待创建的数据库表名,缺省值是和name 一样,只是将"."替换成""。
_inherits 和_inherit 都用于对象的继承,详细说明参见后文。
_inherit 继承有两种情况:
如果子类中不定义_name 属性,则相当于在父类中增加一些字段和方 法,并不创建新对象。
如果子类中定义 _name 属性,则创建一个新对象,新对象拥有老对象的所 有字段和方法,老对象不受任何影响。两种情况的示例及继承关系的图示见下面。
class res_partner_add_langs(osv.osv):
_inherit = 'res.partner'
_columns = {
'lang_ids' : fields.many2many('res.lang', 'res_lang_partner_rel', 'partner_id', 'lang_id', 'Languages'),
}
res_partner_add_langs()
class formateur(osv.osv):
_name = 'formateur'
_inherit = 'res.partner'
_columns = {
'lang_ids' : fields.many2many('res.lang', 'res_lang_partner_rel', 'partner_id', 'lang_id', 'Languages'),
}
formateur()
inherits 相当于多重继承。子类通过_inherits 中定义的字段和各个父类关联,子类不拥有父类的 字段,但可以直接操作父类的所有字段和方法。_inherits 的示例及图示见下图。
class cursus_category(osv.osv):
_name = 'cursus.category'
_inherits = {'account.analytic.caccount':'analytic_caccount_id'}
_columns = {
'analytic_caccount_id' : fields.many2one('account.analytic.caccount', 'ID'), }
cursus_category()
例子2:
参考: https://doc.odoo.com/6.0/developer/2_5_Objects_Fields_Methods/object_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'
}
(...)
参考: Whats the difference between inherit and inherits? https://www.odoo.com/forum/how-to/developers-13/whats-the-difference-between-inherit-and-inherits-52205
https://www.odoo.com/files/memento/OpenERP_Technical_Memento_latest.pdf