openerp经典收藏 对象定义详解(转载)

对象定义详解

原文地址:
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitlab,ldap新用户无法登陆,报错 Could not authenticate you from Ldapmain because “Undefined method `provider‘

查看/var/log/gitlab/gitlab-rails/application.log日志&#xff0c;报错如下&#xff1a; 2022-06-16T07:31:57.865Z: (LDAP) Error saving user cnwangsan,ouzmjkf,dczmjkf,dccn (123847567qq.com): ["Email is not allowed for sign-up. Please use your regular email…

gitlab集成ldap用户后,禁用原来的账户体系进行拉取代码

gitlab在集成ldao用户后&#xff0c;经过测试&#xff0c;用户可以还可以通过原来的账号体系进行项目代码的拉取&#xff0c;需要把原来的账号体系的拉取功能关闭&#xff0c;使用ldap的账号体系进行工作开展。 方法如下&#xff1a; 在管理员-设置-通用-登录限制里把 Allow…

ffmpeg 分辨率 压缩_用GPU加速FFmpeg中的超分辨率功能

1. 简要回顾首先简单复述一下FFmpeg中对深度学习的支持情况&#xff0c;如上图所示&#xff0c;FFmpeg在libavfilter中支持基于深度学习的filter&#xff0c;目前已经支持sr, derain和dnn_processing等filter&#xff0c;其中&#xff0c;dnn_processing是一个通用的filter&…

oFono学习笔记——GATChat(2):发送AT命令

摘要&#xff1a; 本文主要描述了GAtChat如何发送AT命令的全过程 1. GAtChat AT命令发送接口 在GAtChat库当中&#xff0c;根据AT命令返回结果的不同&#xff0c;GAtChat定义了四种不同的发送接口&#xff1a;一般发送接口&#xff0c;表单发送接口&#xff0c;PDU表单发送接口…

archery集成ldap无法登陆

archery配置ldap之后,浏览器提示用户名或密码错误,请重新输入,去ldap日志查看,用户已经认证成功。 archery服务报错如下: [2022-06-16 14:00:03,221][MainThread:140070598219584][task_id:django_auth_ldap][backend.py:368][WARNING]- Caught LDAPError while authenti…

mysql存储过程输入参数拆分_一文看懂mysql数据库存储过程、函数、视图、触发器、表...

概述抽空总结一下mysql的一些概念性内容&#xff0c;涉及存储过程、函数、视图、触发器等。一、查看存储过程、函数、视图、触发器、表1、存储过程select * from mysql.proc where typePROCEDURE;show procedure status; show create procedure proc_name; //存储过程定义2、函…

文本框内容改变触发事件

input 在IE中有onchange事件&#xff0c;但是这个事件所表现的效果不是我们想要的&#xff0c;它所表现的效果为&#xff1a;当input内的内容发现更改时&#xff0c;并不会触发你所指定的方法&#xff08;函数&#xff09;&#xff0c;所以一般的人不用使用这个事件&#xff0c…

oracle vm发现无效设置_Oracle数据库编译失效对象相关命令总结大全,值得收藏

概述在日常数据库维护过程中&#xff0c;我们会发现数据库中一些对象(包Package、存储过程Procedure、函数Function、视图View、同义词.....)会失效,呈现无效状态(INVALID)。有时候需要定期检查数据库中存在哪些失效对象&#xff0c;对于存在异常的对象需要重新编译&#xff0c…

WCF-001:WCF的发布

随着“云”时代的到来&#xff0c;“云”已经无处不在了。什么是“云”&#xff0c;无非就是利用互联网强大的功能建立多个服务器&#xff0c;然后再利用互联网的传输数据的特点将数据从某个服务器中读取出来或者将你的数据上传上去。当然这个服务器不是一定就是传统意义的服务…

在线编辑_水墨-在线 Markdown 编辑器

水墨-在线 Markdown 编辑器基于 Spring-boot、FreeMarker、layui、Vditor 构建的一款在线 所见即所得的 Markdown 编辑器。水墨-在线 Markdown 编辑器。本人使用 Vditor 编辑器时日已久&#xff0c;眼看着其功能日益强大&#xff0c;特此基于 Vditor 构建一款 Web 编辑器&#…

(转载)mysql 用drop和delete方法删除用户的区别

&#xff08;转载&#xff09;http://hi.baidu.com/yymagento/item/56c3f6184bce8347e75e06db在学习drop方法删除用户时&#xff0c;按照书上讲的一直没操作成功&#xff0c;后来到网上查了点其他资料&#xff0c;才弄明白drop的方法&#xff0c;贴出来和大家分享一下。 &#…

退出出库复核是什么意思_细思极恐!为什么是黄晓明退出而不是李菲儿?因为女方是芒果艺人...

本文转载自&#xff1a;娱评人吴清功序言&#xff1a;《乘风破浪的姐姐》第二季即将接档《姐姐的爱乐之程》&#xff0c;于每周五晚上十点档播出。2021年1月5日&#xff0c;《乘风破浪的姐姐2》第一次公演举行&#xff0c;选手李菲儿和发起人黄晓明有亲密互动&#xff0c;李菲儿…

ie6 ie7下使用clear不能将浮动的元素换行问题

在主流浏览器中使用clear方法可以轻松完成浮动元素的换行。 例如&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.o…

传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)

勿在流沙筑高台&#xff0c;出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园&#xff0c;面向编程&#xff0c;春暖花开&#xff01;本文导图&#xff1a;一、由一个提问引发的思考在Stack Overflow 看到这样一个问题&#xff1a;Is Java “pass-by-refere…

java位运算(转)

位移动运算符: <<表示左移, 左移一位表示原来的值乘2. 例如&#xff1a;3 <<2(3为int型) 1&#xff09;把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011&#xff0c; 2&#xff09;把该数字高位(左侧)的两个零移出&#xff0c;其他的数字都朝左平移2位…

android图片的缩放、圆角处理

android中图片缩放方法有三种&#xff1a;1&#xff0c;bitmapFactory&#xff1b;2&#xff0c;bitmapmetrix&#xff1b;3&#xff0c;thumbUtil 方法一&#xff1a;bitmapFactory&#xff1a; public static Bitmap resizeBitmapByFactory(String path, int w, int h) {Bitm…

Navicat for MySQL介绍以及Navicat for MySQL基本使用方法

Navicat for MySQL是一款流行的MySQL图形化管理工具。 如何使用Navicat for MySQL连接MySQL服务器&#xff1f; 1.单击“连接”按钮&#xff0c;出现“新建连接”窗口。 2.分别输入连接名、MySQL 服务器主机地址、服务 端口号、用户名和密码&#xff0c;单击“确定” 按钮。…

python正则表达式怎么用_Python如何使用正则表达式

1. Python与正则表达式开始查看python当前如何通过使用re模式来支持正则表达式&#xff0c;re模式在古老的Python1.5版本中引入&#xff0c;用于替换哪些已经过时的regex模块和regsub模块---这两个模块在Python2.5版本中被移除&#xff0c;并且此后导入这两个模块中的任意一个都…

MySQL小白飞速成长记-运算符篇

运算符连接表达式中的各个操作数&#xff0c;其作用是指明对操作数所进行的运算。常见的运算有数学运算&#xff0c;比较运算和逻辑运算。运算符可以更加灵活地使用表中地数据&#xff0c;常见的运算符类型&#xff1a;算术运算符&#xff0c;比较运算符和逻辑运算符。 上面说…

批处理通过字符串截取得到文件名

当有一个完整的文件路径时&#xff0c;如何截取文件名呢&#xff0c;可以使用 echo 命令。 如下代码&#xff1a; echo off set a"E:\Program Files\Image-Line\FL Studio 9\FL.exe" set b"E:\Program Files\Image-Line\FL Studio 9\Plugins\VST\Revitar20\Effe…