OpenERP对象详细定义详细分析

OpenERP对象详细定义详细分析

 

OpenERP的对象定义的一般形式如下。
程序代码:

class name_of_the_object(osv.osv):

    _name = 'xxx'

    ......

name_of_the_object()

 

#Sample:

class qingjd(osv.osv):

    _name = 'qingjia.qingjd'

    _description = '请假单'

    _columns = {

        'shenqr': fields.many2one('hr.employee', '申请人', required=True),

    }

qingjd()

 

对象定义的完整属性如下:
必须属性
       _name     
       _columns  
可选属性
       _table  
       _description
       _defaults
       _order
       _rec_name  
       _auto  
       _constraints
       _sql_constraints
       _inherit
       _inherits
详细分析各个属性。

 

_auto: 是否自动创建对象对应的Table,缺省值为: True。当安装或升级模块时,OpenERP会自动在数据库中为模块中定义的每个对象创建相应的Table。当这个属性设为False时,OpenERP不会自动创建Table,这通常表示数据库表已经存在。例如,当对象是从数据库视图(View)中读取数据时,通常设为False

_columns: 定义对象的字段,系统会字段为这里定义的每个字段在数据库表中创建相应的字段。关于字段(Fields)的定义,参见后文。

_constraints: 定义于对象上的约束(constraints),通常是定义一个检查函数,关于约束的详细说明,参见后文。

_defaults: 定义字段的缺省值。当创建一条新记录(record or resource)时,记录中各字段的缺省值在此定义。

_description: 对象说明性文字,任意文字。

_log_access: 是否自动在对应的数据表中增加create_uid, create_date, write_uid, write_date四个字段,缺省值为True,即字段增加。这四个字段分布记录record的创建人,创建日期,修改人,修改日期。这四个字段值可以用对象的方法(perm_read)读取。

_name: 对象的唯一标识符,必须是全局唯一。这个标识符用于存取对象,其格式通常是"ModuleName.ClassName",对应的,系统会字段创建数据库表"ModuleName_ClassName"

_order: 定义search()read()方法的结果记录的排序规则,和SQL语句中的order 类似,缺省值是id,即按id升序排序。详细说明参见后文。

_rec_name: 标识record name的字段。缺省情况(name_get没被重载的话)方法name_get()返回本字段值。_rec_name通常用于记录的显示,例如,销售订单中包含业务伙伴,当在销售订单上显示业务伙伴时,系统缺省的是显示业务伙伴记录的_rec_name

_sequence: 数据库表的id字段的序列采集器,缺省值为: NoneOpenERP创建数据库表时,会自动增加id字段作为主键,并自动为该表创建一个序列(名字通常是表名_id_seq”)作为id字段值的采集器。如果想使用数据库中已有的序列器,则在此处定义序列器名。

_sql: _autoTrue时,可以在这里定义创建数据库表的SQL语句。不过5.0以后好像不支持了,不建议使用。

_sql_constraints: 定义于对象上的约束(constraints),和SQL文中的约束类似,关于约束的详细说明,参见后文。

_table: 待创建的数据库表名,缺省值是和_name一样,只是将"."替换成"_"

_inherits:

_inherit: _inherits_inherit都用于对象的继承。

 

_constraints

_constraints可以灵活定义OpenERP对象的约束条件,当创建或更新记录时,会触发该条件,如果条件不符合,则弹出错误信息,拒绝修改。

_constraints的定义格式:

  [(method, 'error message', list_of_field_names), ...]

 

method: 是对象的方法,该方法的格式为:

error message: 不符合检查条件(method返回False)时的错误信息。

list_of_field_names: 字段名列表,这些字段的值会出现在error message中。通常列出能帮助用户理解错误的字段。

_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'])

    ]

 

_sql_constraints _order

    _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)

 

_order在对象的searchread方法中的select语句上加上"Order"子句,如 _order = 'name desc, account_id',对应SQL文的Order子句:order by name desc, account_id

_defaults

   _defaults属性用于定义字段的缺省值,其格式为:

 

_defaults{

        'name_of_the_field':function, ...

    }

lambdaPython的行函数,"lambda obj, cr, uid, context: uid"等同于下述函数:

def func(obj, cr, uid, context):

    return uid

 

_inherit_inherits

    _inherit继承有两种情况,1)如果子类中不定义_name属性,则相当于在父类中增加一些字段和方法,并不创建新对象。2)如果子类中定义_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()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值