字段访问
记录集提供一个“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)。提供了注册访问,记录缓存,管理重新计算的数据结构。
>>> records.env
<Environment object ...>
>>> records.env.user
res.user(3)
>>> records.env.cr
<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。