很是有用的odoo ORM参考手册: odoo V10中文参考手册(一:ORM API (部份内容没有更新到这里)html
坑! 若是数据表已存在记录, 当新增字段时, 填了required=True 只是对界面进行了限制...数据库没有requiredgit
模型的属性结构:数据库
_name 业务对象的名称 _rec_name 可选的name字段名称,供osv的name_get()方法使用,默认值name _inherit 若是设置了name属性,它的取值是单个或多个父级的模型名称;没有设置name属性时,只能是单个模型名称 _order 在搜索的时候的默认排序,默认值是id _auto 指定该表是否须要建立,默认值是True,若是设置成False须要重写init方法来建立表 _table 当_auto设置成false时,该值为建立的表名;默认状况下会自动生成一个 _inherits 定义上级模型关联使用的外键
- create(vals) 增 - browse([ids]) 查 - unlink() 删 - write(vals) 改 int或float型字段,给定的值须为对应的整型或浮点型 布尔型字段,对应的值须为bool型 Selection字段,给定的值须符合条件 Many2one字段,给定的值须与对应的数据库记录相符 其余无关联关系的字段使用字符串做值 One2many和Many2many字段经过一个特殊的格式命令来操纵对应字段值,经过一系列三元组按顺序来对数据进行操做,下面是一些经常使用的: (0, _, values) 为指定的value字典添加一条新记录 (1, id, values) 更新一条现有记录,条件是id为指定id且value在指定values中,不能在create方法里使用 (2, id, _) 将指定id的数据从数据集中删除并从数据库删除,不能在create里使用 (3, id, _) 将指定id的数据从数据集中删除但不从数据库删除,不能用在One2many关系及create里 (4, id, _) 将指定id的数据添加到数据集中,不能用在One2many关系上 (5, _, _) 将集合的全部数据删除,至关于当3做用于每条记录上 (6, _, ids) 使用ids列表里匹配的全部数据替换当前记录,至关于先执行5再循环执行4 read([fields]) 从self里读取指定的字段,专供rpc使用 read_group(domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True) 获得一个经过groupby参数分组后的记录的列表
- search(args[, offset=0][, limit=None][, order=None][, count=False]) 根据args参数里的domain表达式来搜索全部记录,参数列表: 1.args domain表达式,为空时返回全部记录 2.offset (int) 从第几条记录开始取 3.limit (int) 返回记录行数的最大值 4.order (str) 排序的字段 5.count (bool) 当值为True的时候只返回匹配记录的条数 - search_count(args) 返回根据给定domain表达式参数查询所获得的记录条数 - name_search(name='', args=None, operator='ilike', limit=100) 返回根据name条件来查询,并知足args指定的domain表达式的记录集合 name (str) -- 用来匹配的name字符串 args (list) -- domain表达式列表 operator (str) -- 用来匹配的操做符,如: 'like' , '='. limit (int) -- 可选参数,最多返回的记录行数
- ids 获得当前记录集合的id列表 - ensure_one() 验证一个记录集合是否只包含一条记录 - exists() 返回当前记录集中真正存在的子集,并把缓存中未删除的部分作标记,可用于判断if record.exists(): - filtered(func) 返回知足func参数内条件的记录集合,参数能够是一个函数或者用.分隔的字段列表 - sorted(key=None, reverse=False) 返回按key排序以后的记录集,key参数能够是一个返回单个key的函数或字段名称或为空,reverse参数为True时即为倒序 - mapped(func) 将func函数应用到全部记录上,并返回记录列表或集合
- sudo([user=SUPERUSER]) 返回经过指定用户获得的新记录集,默认会返回SUPERUSER的记录集(前提是权限没有问题) - with_context([context][, **overrides]) 返回当前记录集在扩展环境下的新记录集,扩展环境能够由指定环境和overrides参数合并而成、或由当前环境和overrides参数合并而成 - with_env(env) 返回在指定环境下的新版记录集合
- fields_get([fields][, attributes]) 以数据字典的形式返回字段的定义,经过继承得来的字段也会在其中,string/help/selection属性会自动被翻译 fields参数是字段列表、为空或不传返回全部字段 attributes 可指定字段的属性、为空或不传时返回所有的 - fields_view_get([view_id | view_type='form']) 返回指定视图的具体组成如:字段,模型,视图结构 参数列表: view_id 视图的id或None view_type 当view_id参数为空时指定视图类型如form,tree等 toolbar 参数为true时将上下文动做包含在内 odoo 视图
- default_get(fields) 获取指定字段的默认值 - name_get() 以列表形式返回每条记录的描述,默认是display_name字段 - name_create(name) 至关于调用create方法建立一条新记录而只设置一个display_name
id 数据识别字段
_log_access 决定额外增长的字段的字段(created_date,write_uid..)是否建立,默认值True
create_date 记录建立的时间
create_uid 建立人的id,关联到res.users
write_date 记录最近的修改时间
write_uid 最近修改记录的用户id,关联到res.users
一些字段名称是给model保留的,用来实现一些预约义的功能。当须要实现对应功能是须要对相应的保留字段进行定义api
name(Char) -- _rec_name的默认值,在须要用来展现的时候使用 active(Boolean) -- 设置记录的全局可见性,当值为False时经过search和list是获取不到的 sequence(Integer) -- 可修改的排序,能够在列表视图里经过拖拽进行排序 state(Selection) -- 对象的生命周期阶段,经过fileds的states属性使用 parent_id(Many2one) -- 用来对树形结构的记录排序,并激活domain表达式的child_of运算符 parent_left,parent_right -- 与 _parent_store结合使用,提供更好的树形结构数据读取
odoo.api.multi(method) 在记录行方式下装饰一个对记录进行操做的方法 odoo.api.model(method) 在记录行方式下装饰一个内容不明确、但模型明确的方法 odoo.api.depends(*args) 返回为compute方法指定依赖字段的装饰器,每一个参数必须是字符串 odoo.api.constrains(*args) 装饰一个约束检查方法,每一个参数必须是须要检查的字段 odoo.api.onchange(*args) 返回一个监控指定字段的onchange方法的装饰器,每一个参数必须是字段名称 odoo.api.returns(model, downgrade=None, upgrade=None) 返回一个获取model实例的方法的装饰器 odoo.api.one(method) odoo.api.v7(method_v7) odoo.api.v8(method_v8)
- class odoo.fields.Field(string=, **kwargs) (普通字段) 参数列表: string(string) -- 用户能看到的字段的标签 help(string) -- 用户能看到的关于该字段的提示 readonly(boolean) -- 字段是否设置为只读,默认为False required(boolean) -- 字段是否为必须,默认False index(boolean) -- 字段是否做为索引保存在数据库中,默认False default -- 字段的默认值,能够是一个特定的值或者一个有返回值的函数,可以使用default=None来忽略字段的default设置 states -- 用数据字典封装视图里的属性-值对,如'readonly', 'required', 'invisible' groups -- 用逗号分隔的xml id列表,能够限制用户对字段的访问 copy(boolean) -- 指定当数据行被复制时该字段是否被复制,默认是True,实时计算字段和one2many字段默认为False oldname(string) -- 以前的字段名称,在作数据迁移的时候orm能够自动进行重命名 - 实时计算字段 可定义一个字段,它的值经过指定函数实时计算得来,定义实时计算字段只须要指定compute属性便可,它有如下几种参数: compute -- 用于计算的函数名称 inverse -- 逆向计算函数的函数名,可选 search -- 实现该字段search方法的函数名 store -- 是否在数据库存储该字段值,默认False compute_sudo -- 是否须要使用超级管理员对该字段进行从新计算 - 关联字段 关联字段的值是经过一系列的外键字段并经过其关联的模型读取,参数:related 属性(string, help, readonly, required,groups, digits, size, translate, sanitize, selection, comodel_name, domain, context)
只要没有被重定义会自动从源字段复制过来,默认状况下关联字段是不保存到数据库的,就像实时计算字段同样,能够经过指定store=True来指定保存 - 依赖于Company的字段 假如一个用户属于多个公司,那么他在不一样记录条件下获得的该字段值是不一样的,参数 company_dependent -- boolean(默认False) - sparse 字段 sparse字段通常是不为null的,大部分这类字段用于序列化存储,参数sparse -- 该字段值的存储位置 - 增长的定义 子类能够重定义与父类同名同类型的字段,字段属性也会从父类继承过来而且能够被重定义 例:第二个子类只为state字段添加提示 class First(models.Model): _name = 'foo' state = fields.Selection([...], required=True) class Second(models.Model): _inherit = 'foo' state = fields.Selection(help="Blah blah blah")
- class odoo.fields.Char(string=, **kwargs) 字符串字段,可指定长度,通常在客户端以单行显示 参数 size (int) -- 值的最大长度 translate -- 启用字段的翻译 - class odoo.fields.Boolean(string=, **kwargs) 布尔类型 - class odoo.fields.Integer(string=, **kwargs) 整型 - class odoo.fields.Float(string=, digits=, **kwargs) 浮点型,可接受digits 参数(total, decimal)指定位数 - class odoo.fields.Text(string=, **kwargs) Text类型,用于储存较多的内容 - class odoo.fields.Selection(selection=, string=, **kwargs) 参数 selection -- 指定该字段的取值列表,为(value,string)列表或一个模型的方法或方法名 selection_add -- 当该字段来自重定义时,它提供selection参数的扩展,为(value,string)列表 - class odoo.fields.Html(string=, **kwargs) 储存html内容 - class odoo.fields.Date(string=, **kwargs) date类型 1.static context_today(record, timestamp=None) 返回客户端时区的当前日期,能够接收一个datetime格式的参数 2.static from_string(value) 将ORM的值转换为date的值 3.static to_string(value) 将date格式的值转换为ORM的值 4.static today(*args) 以ORM值的格式返回当前日期 - class odoo.fields.Datetime(string=, **kwargs)
- class odoo.fields.Many2one(comodel_name=, string=, **kwargs) 该字段的获取到的集合的记录数量只会是0(无记录)或1(单条记录) 参数列表: comodel_name(string) -- 目标模型名称,除非是关联字段不然该参数必选 domain -- 可选,用于在客户端筛选数据的domain表达式 context -- 可选,用于在客户端处理时使用 ondelete -- 当所引用的数据被删除时采起的操做,取值:'set null', 'restrict', 'cascade' auto_join -- 在搜索该字段时是否自动生成JOIN条件,默认False delegate -- 设置为True时能够经过当前model访问目标model的字段,与_inherits功能相同 - class odoo.fields.One2many(comodel_name=, inverse_name=, string=, **kwargs) 该字段的值是目标model的全部记录 参数列表: comodel_name -- 目标模型名称, inverse_name -- 在comodel_name 中对应的Many2one字段 domain -- 可选,用于在客户端筛选数据的domain表达式 context -- 可选,用于在客户端处理时使用 auto_join -- 在搜索该字段时是否自动生成JOIN条件,默认False limit(integer) -- 可选,在读取时限制数量 注:除非是关联字段,不然comodel_name和inverse_name是必选参数 虚拟的关系 必须依赖Many2one One2many是一个虚拟关联,因此必须有一个Many2one字段存在于other_model,其名称也必须是related_field - class odoo.fields.Many2many(comodel_name=, relation=, column1=, column2=, string=, **kwargs) 该字段的值为一个数据集合 参数: comodel_name -- 目标模型名称,除非是关联字段不然该参数必选 relation -- 可选,关联的model在数据库存储的表名,默认采用comodel_name获取数据 column1 -- 可选,与relation表记录相关联的列名 column2 -- 可选,与relation表记录相关联的列名 domain -- 可选,用于在客户端筛选数据的domain表达式 context -- 可选,用于在客户端处理时使用 limit(integer) -- 可选,在读取时限制数量 - class odoo.fields.Reference(selection=, string=, **kwargs) 基于odoo.fields.Selection
odoo有三种模块化的模型继承机制:缓存
1 根据原有模型建立一个全新的模型,并基于新建立的模型修改,新模型与已存在的视图兼容,并保存在同一张表中
2 从其余模块中扩展模型,并进行替换,通常用于复制,已存在的视图会忽略新建的模型,数据保存在新的数据表中
3 经过代理访问其余模型的字段,能够同时继承多个模型,数据保存在新的数据表中,新的模型会包含一个嵌入的原模型,而且该模型数据是同步的app
当_inherit和_name属性一块儿使用时,odoo基于原有模型建立一个新模型,新的模型会自动继承原模型的字段、方法等dom
class Inheritance0(models.Model): _name = new _inherit = obj1 pass
当只使用_inherit属性时,新的模型会替代已存在的模型,当须要给模型添加字段、方法、重置属性时比较有用ide
class Inheritance1(models.Model): _name = obj1 # 能够忽略不写 _inherit = obj1 pass
代理模式使用_inherits属性来指定一个模型当找不到指定字段时直接去对应的子模型查找
继承并新建
将新model的每一个记录连接到父model中, 而且能够访问(读取/修改)父记录字段模块化