odoo里面的一些ORM操作
案例0001
sale_obj=self.env['sale.order'].browse(k)
通过browse查找对象
找到对象里面的 sale_obj.name
browse
获取一个数据库id或一个ids列表,并返回一个记录集,当从Odoo外部获得记录id时(例如通过外部系统的往返)或在旧API中调用方法时,会很有用:
>>> self.browse([7, 18, 12])
res.partner(7, 18, 12)
exists()
返回一个新的记录集,其中只包含数据库中存在的记录。可以用来检查记录(如从外部获得的)是否仍然存在:
if not record.exists():
raise Exception("The record has been deleted")
或者在调用了一个可以删除一些记录的方法之后:
records.may_remove_some()
# only keep records which were not deleted
records = records.exists()
ref()
环境方法返回与提供的外部id匹配的记录(external id):
>>> env.ref('base.group_public')
res.groups(2)
ensure_one()
检查记录集是不是一个单例(只包含一个记录),否则会产生一个错误:
records.ensure_one()
# is equivalent to but clearer than:
assert len(records) == 1, "Expected singleton"
案例0002
filtered()
返回一个记录集,其中只包含满足所提供的断言功能的记录。断言也可以是一个字符串,由字段为真或假来过滤:
通过条件过滤产生一个记录集
# only keep records whose company is the current user's
records.filtered(lambda r: r.company_id == user.company_id)
# only keep records whose partner is a company
records.filtered("partner_id.is_company")
sorted()
返回按所提供的key函数排序的记录集。如果没有提供key,请使用该模型的默认排序顺序:
# sort records by name
records.sorted(key=lambda r: r.name)
mapped()
将所提供的函数应用到记录集中的每个记录,如果结果是记录集,则返回一个记录集:
# returns a list of summing two fields for each record in the set
records.mapped(lambda r: r.field1 + r.field2)
所提供的函数可以是一个字符串去获取对应的字段值:
# returns a list of names
records.mapped('name')
# returns a recordset of partners
record.mapped('partner_id')
# returns the union of all partner banks, with duplicates removed
record.mapped('partner_id.bank_ids')
计算字段(Computed fields)
可以使用compute
参数计算字段(而不是直接从数据库读取)。它必须将计算的值分配给字段。如果它使用其他字段的值,那么它应该使用depends()
来指定那些字段:
from odoo import api
total = fields.Float(compute='_compute_total')
@api.depends('value', 'tax')
def _compute_total(self):
for record in self:
record.total = record.value + record.value * record.tax
- 在使用子字段时,依赖项可以是虚线(dotted paths):(dependencies can be dotted paths when using sub-fields:)
@api.depends('line_ids.value')
def _compute_total(self):
for record in self:
record.total = sum(line.value for line in record.line_ids)
- 计算字段不是默认存储的,它们是在被请求时计算和返回的。设置
store=True
会将它们存储在数据库中并自动启用搜索 - 还可以通过设置
search
参数来启用计算字段。value是返回一个域的方法名:
upper_name = field.Char(compute='_compute_upper', search='_search_upper')
def _search_upper(self, operator, value):
if operator == 'like':
operator = 'ilike'
return [('name', operator, value)]
odoo里面的一些ORM操作的更多相关文章
- Python/Django(CBV/FBV/ORM操作)
Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...
- python/ORM操作详解
一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...
- Django中ORM操作
ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...
- Django的ORM操作
ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...
- python 外键用法 多对多关系 ORM操作 模板相关
一.app/models中写类(设计表结构) 1.普通类 class A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...
- Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作
一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...
- Django ORM 操作 必知必会13条 单表查询
ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...
随机推荐
- Python跨域问题解决集合
Flask 安装插件 pip install flask-cors 使用 CORS函数配置全局路由 from flask_cors import * app = Flask(__name__) COR ...
- sql优化问题
一.分析阶段 一 般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性.可用性.可靠性.安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能 是很重要的非功能性需求,必须根据系统 ...
- 如何优雅的实现Mysql 增删改查,看完你就会了
接着上期说,上期没写一条sql就把数据查询出来了,那如果要保存或者更新数据怎么办呢?能不能自己写sql呢? 保存数据 @GetMapping("save")//保存数据 publi ...
- 通过AI识图判断图片是否为小票
先在百度智能云中创建一个应用加入以下标记功能(没有智能云账号可以去创建一个,创建应用也都是些基本操作) 本次只用到标记的功能. 此功能在图像识别下面. 创建应用后,页面会出现平台分配的密钥:API K ...
- Golang获取CPU、内存、硬盘使用率
Golang获取CPU.内存.硬盘使用率 工具包 go get github.com/shirou/gopsutil 实现 func GetCpuPercent() float64 { percent ...
- Redis的数据安全与性能保障
1.持久化选项 Redis提供了2种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里.另一种方法叫只追加文件(appen ...
- 最强阿里巴巴历年经典面试题汇总:C++研发岗
(1).B树.存储模型 (2).字典树构造及其优化与应用 (3).持久化数据结构,序列化与反序列化时机(4).在无序数组中找最大的K个数? (4).大规模文本文件,全是单词,求前10词频的单词 (5) ...
- 20、checkconfig
chkconfig控制的原理(/etc/init.d/里面设置脚本,在/etc/rc.d/rc..d中设置软连接,通过chkconfig进行管理,同时也加入到了service服务,chkconfig设 ...
- 无向图(邻接表实现)DFS_AND_BFS
数据结构选择TreeSet的原因:通过自定义的Compare方法,保证了点元素的唯一性,有序性(方便检验): 传入Set和Map中的元素类似于C中的指针操作,即共享地址,改变其中一个中的元素,与之相关 ...
- Vue(14)slot插槽的使用
为什么使用slot slot(插槽) 在生活中很多地方都有插槽,电脑usb的插槽,插板当中的电源插槽 插槽的目的是为了让我们原来的设备具备更多的扩展性 比如电脑的USB我们可以插入U盘,手机,鼠标,键 ...