odoo10 ORM操作

参照 https://www.kancloud.cn/hx78/odoo_10/416223#CRUD_303
坑! 如果数据表已存在记录, 当新增字段时, 填了required=True 只是对界面进行了限制...数据库没有required

一 模型使用

模型的属性结构:

_name 业务对象的名称
_rec_name 可选的name字段名称,供osv的name_get()方法使用,默认值name
_inherit 如果设置了name属性,它的取值是单个或多个父级的模型名称;没有设置name属性时,只能是单个模型名称
_order 在搜索的时候的默认排序,默认值是id
_auto 指定该表是否需要创建,默认值是True,如果设置成False需要重写init方法来创建表
_table 当_auto设置成false时,该值为创建的表名;默认情况下会自动生成一个
_inherits 定义上级模型关联使用的外键

1 ORM的CRUD

- 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参数分组后的记录的列表

2 searching

- 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) -- 可选参数,最多返回的记录行数

3 记录集合操作

- ids                                      得到当前记录集合的id列表
- ensure_one()                             验证一个记录集合是否只包含一条记录
- exists()                                 返回当前记录集中真正存在的子集,并把缓存中未删除的部分做标记,可用于判断if record.exists():
- filtered(func)                           返回满足func参数内条件的记录集合,参数可以是一个函数或者用.分隔的字段列表
- sorted(key=None, reverse=False)          返回按key排序之后的记录集,key参数可以是一个返回单个key的函数或字段名称或为空,reverse参数为True时即为倒序
- mapped(func)                             将func函数应用到所有记录上,并返回记录列表或集合

4 环境切换

- sudo([user=SUPERUSER])                        返回通过指定用户得到的新记录集,默认会返回SUPERUSER的记录集(前提是权限没有问题)
- with_context([context][, **overrides])        返回当前记录集在扩展环境下的新记录集,扩展环境可以由指定环境和overrides参数合并而成、或由当前环境和overrides参数合并而成
- with_env(env)                                 返回在指定环境下的新版记录集合

5 字段和视图查询

- 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 视图

6 其他方法

- default_get(fields)             获取指定字段的默认值
- name_get()                      以列表形式返回每条记录的描述,默认是display_name字段
- name_create(name)               相当于调用create方法创建一条新记录而只设置一个display_name

7 内置字段

id 数据识别字段
_log_access 决定额外增加的字段的字段(created_date,write_uid..)是否创建,默认值True
create_date 记录创建的时间
create_uid 创建人的id,关联到res.users
write_date 记录最近的修改时间
write_uid 最近修改记录的用户id,关联到res.users

8 保留字段

一些字段名称是给model保留的,用来实现一些预定义的功能。当需要实现对应功能是需要对相应的保留字段进行定义

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)

三 字段

1 基本字段

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

2 常用字段

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

3 关系模型字段

- 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 通过代理访问其他模型的字段,可以同时继承多个模型,数据保存在新的数据表中,新的模型会包含一个嵌入的原模型,并且该模型数据是同步的

1 传统继承

当_inherit和_name属性一起使用时,odoo基于原有模型创建一个新模型,新的模型会自动继承原模型的字段、方法等

class Inheritance0(models.Model):
    _name = new
    _inherit = obj1

    pass

2 扩展

当只使用_inherit属性时,新的模型会替代已存在的模型,当需要给模型添加字段、方法、重置属性时比较有用

class Inheritance1(models.Model):
    _name = obj1    # 可以忽略不写
    _inherit = obj1

    pass

3 代理

代理模式使用_inherits属性来指定一个模型当找不到指定字段时直接去对应的子模型查找

继承并新建
将新model的每个记录链接到父model中, 并且可以访问(读取/修改)父记录字段

原文地址:https://www.cnblogs.com/sunch/p/10553764.html

时间: 2024-10-08 15:34:25

odoo10 ORM操作的相关文章

Python/Django(CBA/FBA/ORM操作)

Python/Django(CBA/FBA/ORM操作) CBA:url对应的类(模式) 1 ##====================================CBA操作============================ 2 3 # class geting(View): 4 # def dispatch(self, request, *args, **kwargs): 5 # print('before') 6 # obj = super(geting,self).dispat

Django 数据库ORM操作

CMDB实现数据展示功能部分代码. views.py def asset(request):     asset = Asset.objects.all()     return render_to_response("asset.html",{'asset': asset})      models.py class Asset(models.Model):     ipaddr = models.CharField(max_length=20, verbose_name=u'IP地

Django入门   数据库的ORM操作之一对多

Django对数据库的是通过ORM实现.什么叫做ORM呢?简单来说,我们通过sql语句查询一张表的所有数据的语句如下  select * from test.而Django中用到的表都是在models.py文件里定义.所以我们要查查询test表里的数据可以通过 test_obj = models.test.objects.all()来获取test表里所有数据的对象.再通过 test_obj.values()方法将每一行数据的里的各个字段以key和value的字典形式读取出来.这就叫ORM操作.

?laravel使用ORM操作数据库

laravel使用ORM操作数据库 public function mode(){ //查询所有 $isok=Student::get(); 新增. (1) $isok=Student::create([ 'name'=>'123','pwd'=>'123' ]); (2) $stu=new Student(); $stu->name="123"; $stu->pwd="ww"; $isok= $stu->save(); //修改 $i

Django之ORM操作(***)

Django之ORM操作(***) 生成数据库: python manage.py makemigrations python manage.py migrate 常用命令: python manage.py runserver 0.0.0.0 python manage.py startapp appname python manage.py syncdb 创建superuser:python manage.py createsuperuser 在项目名中的__init__ .py 加: im

ORM操作

今天闲来无事简单谈下ORM操作. 一:前言 1.什么是ORM ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法. 2.为什么会出现ORM思想 先从项目中数据流存储形式这个角度说起.简单拿MVC这种分层模式.来说. Model作为数据承载实体. 在用户界面层和业务逻辑层之间数据实现面向对象OO形式传递. 当我们

Python学习---抽屉框架分析[ORM操作]180314

Django ORM操作     1. 字段操作         class User(model.Model);             u=字段        用处:            1 .admin中的字段验证            2. obj.clean_fields() 进行自定义的验证             3. 利用Djanfo Form进行验证,此时前台和后台的操作分开               但form和model里的字段重复[推荐使用]             

python 外键用法 多对多关系 ORM操作 模板相关

一.app/models中写类(设计表结构) 1.普通类 class  A(models.Model): id=modles.AutoField(primary_key=True) name=models.CharField(max_length=32,unique=True) 2.设置外键 class B(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32,

Django中的app及mysql数据库篇(ORM操作)

Django常见命令 在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目.启动Django程序.创建新的APP.数据库迁移等. 创建Django项目 一把我们都新建一个文件夹来存放项目文件,切换到这个目录下,启动命令行工具.创建一个名为mysite的Django项目: django-admin startproject mysite 创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹,mysite的文件夹目录结构如下: mysite/ ma