Odoo ORM API
对于Odoo ORM API 的一些记录

字段访问
记录集提供一个“Active Record”接口,模型字段可以直接从记录集进行读写,但只在单个记录记录集中。给字段值设置一个触发器,使他进行数据库更新。

对记录集进行多次读写操作会引发异常。
同时对多个字段进行更新时,用write()方法

记录集是不可变的,但相同模型的记录可以通过操作符连接,返回新的记录集。

记录集提供了一个“活动记录”接口。模型字段可以直接从记录集中读写,但只能在单个记录记录集中。为字段值设置触发器以使他更新数据库。


对记录集执行多次读写操作将导致异常。

同时更新多个字段时,请使用write()方法

记录集是不可变的,但同一模型的记录可以由运算符连接以返回新的记录集。



操作符
record in set:返回当前记录集中的记录。 
set1 <= set2 、set1 < set2:返回set1是否是set2的子集
set1 >= set2 、set1 > set2: 返回set1是否是包含set2的集合
set1 | set2 :返回两个集合的并集的新记录集。。
set1 & set2 :返回两个集合的交集的新记录集。
set1 - set2 :返回新记录集,其中只包括set1中有而set2中不存在的记录。

其他一些记录集操作
filtered():返回符合所给条件的记录。
# 只保留当前公司用户的记录。
records.filtered(lambda r: r.company_id == user.company_id)

# 只保留合伙人是公司的记录。
records.filtered("partner_id.is_company")

sorted():返回按所给关键字排序的记录。如果没有提供关键词,用默认排序。
# 通过名称关键字排序
records.sorted(key=lambda r: r.name)

mapped():对记录集中的记录应用所给方法,返回结果的记录集。
# 返回两个记录集中记录两两相加的结果的记录集。
records.mapped(lambda r: r.field1 + r.field2)

也可以通过字符串返回字段的值
# 返回名字的列表
records.mapped('name')

# 返回一个partner的记录集
record.mapped('partner_id')

#返回所有合作银行的集合, with duplicates removed
record.mapped('partner_id.bank_ids')

--------Environment----------
Environment 是 odoo 中操作db的总句柄。Environment存着很多ORM的上下文数据:数据库游标(用于数据库查询),当前用户(用于核对访问权限),当前上下文(存储任意数据)。Environment中也存储缓存。
所有记录集都有environment,是不可修改的,可以通过“env”得到,可以访问当前用户(user),游标(cr),或者上下文(context)。提供了注册访问,记录缓存,管理重新计算的数据结构。

  1. >>> records.env

  2. <Environment object ...>

  3. >>> records.env.user

  4. res.user(3)

  5. >>> records.env.cr

  6. <Cursor object ...)


对于继承了Model的类来说可以直接通过self.env得到 Environment

在请求的 Controller 可以通过 request.env()得到 Environment

通过模型类或模型类对象获取,cls.env、product.env

一些常用属性列表:

返回当前用户 
self.env.user

返回当前用户id
self.env.uid

返回当前语言代码
self.env.lang

当前数据库连接
self.env.cr

返回是否处于草稿模式
self.env.in_draft
应用例
1.利用env[model]获取类对象:
self.env['ir.model'].search([('state', '!=', 'manual')])
2.利用cr执行sql语句:
self.env.cr.execute(query, (value,))

改变Environment
Environment可以从一个记录集中被自定义。
sudo():通过提供的用户记录创建新的environment,# create partner object as administrator
env['res.partner'].sudo().create({'name': "A Partner"})

返回是否处于'onchange'草稿模式
self.env.in_onchange

# list partners visible by the "public" user
public = env.ref('base.public_user')
env['res.partner'].sudo(public).search([])

with_context():可接受单个定位参数,来替换当前env的上下文;可以根据关键字接受任意个参数,然后添加到当前的env的上下文。


# look for partner, or create one with specified timezone if none is found
env['res.partner'].with_context(tz=a_tz).find_or_create(email_address)

——————————————----------------
<field name="name" on_change="0"/>
添加οnchange=“0”属性,就不执行onchange。

Odoo ORM API
Henry 31 十月, 2020
分享这片文章
存档
登录 留下评论
odoo字段属性fields.one2many
odoo/openERP one2many fields动态域