对象定义详解

原文地址:
http://shine-it.net/index.php/topic,2159.0.html
http://blog.sina.com.cn/s/blog_57ded94e01013xa9.html

本连载准备详细解密OpenERP的对象定义,内容包括深入理解OpenERP的对象,对象详细定义、字段详细定义、对象的预定义方法、OpenERP的Services等部分,力求每一部分都详细说明。
要完全理解OpenERP的开发,需要理解这么几个部分:OpenERP的对象,OpenERP的视图及Action,OpenERP的Workflow,OpenERP的Report。理解了这几部分就可以比较彻底的理解OpenERP开发平台了,本连载力求解说第一部分。
本连载将会是OpenERP对象开发的“史上最牛”手册,本连载的内容综合了OpenERP的官方手册,以及大量的“民间野史”,再加以大量的代码研究和亲自实验,终熬制成本手册。
本连载可算做OpenERP开发的提高篇,希望读者对象先学习完《OpenERP应用和开发基础》,参见http://shine-it.net/index.php/topic,882.0.html
第一部分:深入理解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字段的序列采集器,缺省值为: None。OpenERP创建数据库表时,会自动增加id字段作为主键,并自动为该表创建一个序列(名字通常是“表名_id_seq”)作为id字段值的采集器。如果想使用数据库中已有的序列器,则在此处定义序列器名。
_sql: _auto为True时,可以在这里定义创建数据库表的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: 是对象的方法,该方法的格式为:def _name_of_the_method(self, cr, uid, ids): −> True|False
· 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 aWHERE 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 Truecr.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在对象的search或read方法中的select语句上加上"Order"子句,如 _order = 'name desc, account_id',对应SQL文的Order子句:order by name desc, account_id。

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

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

----------------------------------------------------------------------------------------------------------------------------------"为人性僻耽佳句,语不惊人死不休"。老肖的文字不是用来惊人的,但是技术文档能写得如此透彻,绝对是花了功夫去专研理解的,向老肖致敬。  对文档做一些小补充:
  • _auto   当_auto的值为“False"时,OE不会自动在数据库中创建相应的表,开发者可以在对应类的init()方法中定义表或视图的SQL。这一般应用在  报表所对应的数据对象中,因为报表的数据对象往往是“视图”,所以我们可以在init()方法中创建所需的数据库视图SQL即可。
  • _columns OE并不一定为每个定义项创建数据库字段,比如:selection, reference, one2many, function等字段是不会有对应的数据库字段的。
  • _name 当使用_inherit时可以与被继承的类的_name一致,_name一致表示不创建新的数据库表,而直接在原表上修改
  • _rec_name   缺省的情况下,name_get方法使用表中的‘name'字段,所以当你定义了一个实体类B,并且实体类B中即没有“name“字段也没有为  _rec_name特别指定一个字段,   那么当OE调用name_get方法时(比如实体类A有一个many2one字段b指向实体类B,显示A.b的值时就会调用类B的name_get方法)  就会报“未定义name字段“的错误
  • _inherits   另外还可以这样理解_inherits,_inherits又被称为实例继承,就是新继承的数据对象不但继承被继承对象的属性和方法同时也继承了数据实  例,即表中的记录。比如product类不但继承product_template的属性和方法,而且这两个表的数据也是同步的。
  • _defaults 在V6中字典的值可以不是函数,就比如在V5中我们必须这样来定义:_defaults= { 'state' : lambda *a: 'draft'} 而在 V6中可以这样来:_defaults = {'state' : 'draft'}
 

转载于:https://www.cnblogs.com/cnshen/p/3166796.html

openerp经典收藏 对象定义详解(转载)相关推荐

  1. python的类和对象_Python面向对象之类和对象实例详解

    本文实例讲述了Python面向对象之类和对象.分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态): 属性一般是一个个变量:方法是一个个函数: #类的属性 ...

  2. android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...

  3. spring依赖注入原理详解(转载)

    spring依赖注入原理详解----转载 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所 ...

  4. 转 C++宏定义详解

    来自:传送门 C++宏定义详解 一.#define的基本用法 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往 ...

  5. Oozie 工作流定义详解【转】

    转自:http://shiyanjun.cn/archives/664.html Oozie工作流程定义详解 Oozie工作流程定义是一个DAG(Directed Acyclical Graphs)图 ...

  6. php中的ol标签,html ol标签的使用与定义详解

    一.ol li有序列表标签语法与结构 内容一 内容二 内容三 以上3个li标签组放在 标签之间.并且ol标签之间可以放若干li标签组. 通常我们使用li标签都是使用无序ul li列表标签.一般情况无论 ...

  7. C++中的宏定义详解

    转载自:C++中的宏定义 和 C++宏定义详解 目录 一.#define解析 1 #define命令剖析 1.1   #define的概念 1.2 宏替换发生的时机 1.3 ANSI标准说明了五个预定 ...

  8. LOD技术——定义详解及相关知识介绍

    LOD技术--定义详解及相关知识介绍 LOD技术(Level Of Detail)指用若干不同复杂度的模型来表示同一对象的技术.此技术主要根据视点距离对象位置的变化调用不同复杂度的模型,即在较远时调用 ...

  9. Scala基础教程--06--类与对象的详解

    Scala基础教程–06–类与对象的详解 章节目标 掌握类和对象的定义 掌握访问修饰符和构造器的用法 掌握main方法的实现形式 掌握伴生对象的使用 掌握定义工具类的案例 1. 类和对象 Scala是 ...

最新文章

  1. 产品经理的必经之路:搭建属于自己的成长模型
  2. 不安全的食品,如何“安全地”上了货架?
  3. IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中
  4. linux中的运行模式,Linux系统运行模式介绍
  5. android log 如何获取double类型后小数点的值_【ES6基础】Symbol介绍:独一无二的值...
  6. 石头剪刀布代码android,微信小程序源码解说:石头剪刀布(附源码下载)
  7. Apple开源了用于ARM CPU的iOS内核
  8. 向集合中添加Person类型并对其排序
  9. Unity3D(七)声音
  10. C语言中,int、char、float、double各占多少字节
  11. 安国主控,U盘量产,起死回生
  12. egret给对象涂颜色
  13. Git:合并分支----git merge命令应用的三种情景
  14. 解决:ipad QQ可以联网,浏览器不能联网
  15. mysql 语句 面试题
  16. [ISCC 2021]部分wp
  17. iOS--AFN实现原理
  18. 视频直播流媒体服务器的http-flv是如何直播的?
  19. ecshop $lang
  20. python爬虫之网易云歌曲下载(需要js分析) -- 2020.06.20更新

热门文章

  1. 湖北大学计算机复试笔试题型,2016年湖北大学计算机与信息工程学院计算机组成原理复试笔试最后押题五套卷...
  2. 非一体式台式计算机,一体台式机推荐及介绍【详解】
  3. vue如何配置服务器端跨域_vue项目里如何配置本地代理实现跨域请求
  4. 华为鸿蒙手机和电视通话,鸿蒙智慧屏首秀:逾10万人预定,电视视频通话功能强大...
  5. php-cgi并发,对于php-fpm和cgi,还有并发响应的理解
  6. java全局机制,java实现全局异常机制
  7. 如何学习matlab 知乎,知乎日报
  8. oracle 11gr2 asm安装,OEL6.1下oracle 11gr2 ASM安装
  9. python雪花算法生成id_理解分布式id生成算法SnowFlake
  10. 2019无盘游戏服务器128g内存,云更新无盘客户端 v2019.8.15.12486官方版