查看“ORM参考”的源代码
←
ORM参考
跳转至:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看并复制此页面的源代码:
==记录集(RecordSet)== 模型和记录的交互通过记录集(同一模型的一组有序记录)进行。 提示 与名称暗示相反,记录集可能包含重复数据。这可能会在将来更改完善。 在模型上定义的方法在记录集上执行,它们的self是记录集: <nowiki> Class AModel(models.Model): _name ='a.model' def a_method(self): #self可以在0个记录和所有记录之间的任何地方 #数据库 self.do_operation() </nowiki> 在记录集上迭代将产生一组单个记录(“singletons”),很像在Python字符串上迭代产生单个字符的字符串: <nowiki> def do_operation(self): print self #=> a.model(1,2,3,4,5) for record in self: print self #=> a.model(1),然后a.model(2),然后a.model(3),... </nowiki> ==字段访问== 记录集提供了一个“活动记录”接口:模型字段可以直接从记录中读取和写入,但只能在单例记录集(单记录记录集)上读取和写入。设置字段的值将触发对数据库的更新: <nowiki> >>> record.name 示例名称 #返回 record 记录 name 字段的值 >>> record.company_id.name 公司名 #返回公司名称 >>> record.name =“Bob” </nowiki> 尝试在多个记录上读取或写入字段将引发错误。 访问关系字段(Many2one,One2many,Many2many)总是返回记录集,如果未设置字段,则为空。 <nowiki> 危险 每个对字段的赋值触发数据库更新,在同时设置多个字段或在多个记录上设置字段(使用相同的值)时,请使用write(): #3 * len(records)次数据库更新 for record in records: record.a = 1 record.b = 2 record.c = 3 #len(records)次数据库更新 for record in records: record.write({'a':1,'b':2,'c':3}) #1次数据库更新 records.write({'a':1,'b':2,'c':3}) </nowiki> ==记录缓存和预取== Odoo为记录的字段维护一个缓存,所以不是每个字段访问都会发出一个数据库请求,这对性能来说是可怕的。以下示例仅对第一条语句查询数据库: record.name#首次访问从数据库读取值 record.name#second access从缓存获取值 为了避免一次读取一个记录上的一个字段,Odoo根据一些启发式方法预取记录和字段以获得良好的性能。一旦必须在给定记录上读取字段,ORM实际上在较大的记录集上读取该字段,并将返回的值存储在高速缓存中供以后使用。预取的记录集通常是记录从中通过迭代而来的记录集。此外,所有简单存储的字段(boolean, integer, float, char, text, date, datetime, selection, many2one)它们对应于模型表的列,并在同一查询中有效地提取。 考虑下面的示例,其中partners是1000条记录的记录集。没有预取,循环将对数据库进行2000次查询。使用预取,只进行一个查询: <nowiki> for partner in partners: print partner.name # first pass prefetches 'name' and 'lang' # (and other fields) on all 'partners' print partner.lang </nowiki> 预取也对辅助记录起作用:当读取关系字段时,它们的值(它们是记录)被预订用于将来的预取。访问这些辅助记录之一会从同一模型预取所有辅助记录。这使得以下示例只生成两个查询,一个用于合作伙伴,一个用于国家/地区: <nowiki> countries = set() for partner in partners: country = partner.country_id # first pass prefetches all partners countries.add(country.name) # first pass prefetches all countries </nowiki> ==集合操作== 记录集是不可变的,但是可以使用各种集合操作来组合相同模型的集合,返回新的记录集。集合操作不保留顺序。 <nowiki> record in set returns whether record (which must be a 1-element recordset) is present in set. record not in set is the inverse operation set1 <= set2 and set1 < set2 return whether set1 is a subset of set2 (resp. strict) set1 >= set2 and set1 > set2 return whether set1 is a superset of set2 (resp. strict) set1 | set2 returns the union of the two recordsets, a new recordset containing all records present in either source set1 & set2 returns the intersection of two recordsets, a new recordset containing only records present in both sources set1 - set2 returns a new recordset containing only records of set1 which are not in set2 </nowiki> ==其他记录集操作== 记录集是可迭代的,所以通常的Python工具可用于
返回至
ORM参考
。
导航菜单
个人工具
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
odoo 中文开发手册
odoo 开发参考
odoo 实施笔记
Odoo 最佳方案
关于 OdooV
Odoo FAQ
工具
链入页面
相关更改
特殊页面
页面信息
友情链接
odoo官网
odoo中文网
odoo实施