“ORM参考”的版本间的差异
第1行: | 第1行: | ||
+ | ==记录集(RecordSet)== | ||
+ | 模型和记录的交互通过记录集(同一模型的一组有序记录)进行。 | ||
+ | 提示 | ||
+ | 与名称暗示相反,记录集可能包含重复数据。这可能会在将来更改完善。 | ||
+ | 在模型上定义的方法在记录集上执行,它们的self是记录集: | ||
+ | AModel类(models.Model): | ||
+ | _name ='a.model' | ||
+ | def a_method(self): | ||
+ | #self可以在0个记录和所有记录之间的任何地方 | ||
+ | #数据库 | ||
+ | self.do_operation() | ||
+ | 在记录集上迭代将产生一组单个记录(“singletons”),很像在Python字符串上迭代产生单个字符的字符串: | ||
+ | def do_operation(self): | ||
+ | print self#=> a.model(1,2,3,4,5) | ||
+ | 自我记录: | ||
+ | 打印记录#=> a.model(1),然后a.model(2),然后a.model(3),... | ||
+ | 现场访问 | ||
+ | 记录集提供了一个“活动记录”接口:模型字段可以直接从记录中读取和写入,但只能在单例记录集(单记录记录集)上读取和写入。设置字段的值将触发对数据库的更新: | ||
+ | >>> record.name | ||
+ | 示例名称 | ||
+ | >>> record.company_id.name | ||
+ | 公司名 | ||
+ | >>> record.name =“Bob” | ||
+ | 尝试在多个记录上读取或写入字段将引发错误。 | ||
+ | 访问关系字段(Many2one,One2many,Many2many)总是返回记录集,如果未设置字段,则为空。 | ||
+ | 危险 | ||
+ | 每个对字段的分配触发数据库更新,在同时设置多个字段或在多个记录上设置字段(使用相同的值)时,请使用write(): | ||
+ | #3 * len(records)数据库更新 | ||
+ | 记录记录: | ||
+ | record.a = 1 | ||
+ | record.b = 2 | ||
+ | record.c = 3 | ||
+ | |||
+ | #len(records)数据库更新 | ||
+ | 记录记录: | ||
+ | record.write({'a':1,'b':2,'c':3}) | ||
+ | |||
+ | #1数据库更新 | ||
+ | records.write({'a':1,'b':2,'c':3}) | ||
+ | 记录缓存和预取 | ||
Odoo为记录的字段维护一个缓存,所以不是每个字段访问都会发出一个数据库请求,这对性能来说是可怕的。以下示例仅对第一条语句查询数据库: | Odoo为记录的字段维护一个缓存,所以不是每个字段访问都会发出一个数据库请求,这对性能来说是可怕的。以下示例仅对第一条语句查询数据库: | ||
record.name#首次访问从数据库读取值 | record.name#首次访问从数据库读取值 | ||
第5行: | 第45行: | ||
考虑下面的示例,其中partners是1000条记录的记录集。没有预取,循环将对数据库进行2000次查询。使用预取,只进行一个查询: | 考虑下面的示例,其中partners是1000条记录的记录集。没有预取,循环将对数据库进行2000次查询。使用预取,只进行一个查询: | ||
合作伙伴: | 合作伙伴: | ||
− | + | print partner.name#first pass prefetches'name'和'lang' | |
− | + | 所有“合作伙伴”上的#(和其他字段) | |
− | + | 打印partner.lang | |
预取也对辅助记录起作用:当读取关系字段时,它们的值(它们是记录)被预订用于将来的预取。访问这些辅助记录之一会从同一模型预取所有辅助记录。这使得以下示例只生成两个查询,一个用于合作伙伴,一个用于国家/地区: | 预取也对辅助记录起作用:当读取关系字段时,它们的值(它们是记录)被预订用于将来的预取。访问这些辅助记录之一会从同一模型预取所有辅助记录。这使得以下示例只生成两个查询,一个用于合作伙伴,一个用于国家/地区: | ||
countries = set() | countries = set() | ||
合作伙伴: | 合作伙伴: | ||
− | + | country = partner.country_id#first pass预取所有合作伙伴 | |
− | + | countries.add(country.name)#首次通过预取所有国家 | |
设置操作 | 设置操作 | ||
记录集是不可变的,但是可以使用各种集合操作来组合相同模型的集合,返回新的记录集。设置操作不保留顺序。 | 记录集是不可变的,但是可以使用各种集合操作来组合相同模型的集合,返回新的记录集。设置操作不保留顺序。 | ||
第22行: | 第62行: | ||
set1 - set2返回一个只包含不在set2中的set1记录的新记录集 | set1 - set2返回一个只包含不在set2中的set1记录的新记录集 | ||
其他记录集操作 | 其他记录集操作 | ||
− | + | 记录集是可迭代的,所以通常的Python工具可用于transfo | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
2017年1月11日 (三) 08:58的版本
记录集(RecordSet)
模型和记录的交互通过记录集(同一模型的一组有序记录)进行。
提示 与名称暗示相反,记录集可能包含重复数据。这可能会在将来更改完善。
在模型上定义的方法在记录集上执行,它们的self是记录集: AModel类(models.Model): _name ='a.model' def a_method(self): #self可以在0个记录和所有记录之间的任何地方 #数据库 self.do_operation() 在记录集上迭代将产生一组单个记录(“singletons”),很像在Python字符串上迭代产生单个字符的字符串: def do_operation(self): print self#=> a.model(1,2,3,4,5) 自我记录: 打印记录#=> a.model(1),然后a.model(2),然后a.model(3),... 现场访问 记录集提供了一个“活动记录”接口:模型字段可以直接从记录中读取和写入,但只能在单例记录集(单记录记录集)上读取和写入。设置字段的值将触发对数据库的更新: >>> record.name 示例名称 >>> record.company_id.name 公司名 >>> record.name =“Bob” 尝试在多个记录上读取或写入字段将引发错误。 访问关系字段(Many2one,One2many,Many2many)总是返回记录集,如果未设置字段,则为空。 危险 每个对字段的分配触发数据库更新,在同时设置多个字段或在多个记录上设置字段(使用相同的值)时,请使用write(): #3 * len(records)数据库更新 记录记录: record.a = 1 record.b = 2 record.c = 3
#len(records)数据库更新 记录记录: record.write({'a':1,'b':2,'c':3})
#1数据库更新 records.write({'a':1,'b':2,'c':3}) 记录缓存和预取 Odoo为记录的字段维护一个缓存,所以不是每个字段访问都会发出一个数据库请求,这对性能来说是可怕的。以下示例仅对第一条语句查询数据库: record.name#首次访问从数据库读取值 record.name#second access从缓存获取值 为了避免一次读取一个记录上的一个字段,Odoo根据一些启发式方法预取记录和字段以获得良好的性能。一旦必须在给定记录上读取字段,ORM实际上在较大的记录集上读取该字段,并将返回的值存储在高速缓存中供以后使用。预取的记录集通常是记录从中通过迭代而来的记录集。此外,所有简单存储的字段(布尔,整数,浮点,字符,文本,日期,日期时间,选择,许多2)它们对应于模型表的列,并在同一查询中有效地提取。 考虑下面的示例,其中partners是1000条记录的记录集。没有预取,循环将对数据库进行2000次查询。使用预取,只进行一个查询: 合作伙伴: print partner.name#first pass prefetches'name'和'lang' 所有“合作伙伴”上的#(和其他字段) 打印partner.lang 预取也对辅助记录起作用:当读取关系字段时,它们的值(它们是记录)被预订用于将来的预取。访问这些辅助记录之一会从同一模型预取所有辅助记录。这使得以下示例只生成两个查询,一个用于合作伙伴,一个用于国家/地区: countries = set() 合作伙伴: country = partner.country_id#first pass预取所有合作伙伴 countries.add(country.name)#首次通过预取所有国家 设置操作 记录集是不可变的,但是可以使用各种集合操作来组合相同模型的集合,返回新的记录集。设置操作不保留顺序。 record in set返回是否在集合中存在记录(必须是1元素记录集)。记录不在集合中是反向操作 set1 <= set2和set1 <set2返回set1是否为set2的子集(分别为strict) set1> = set2和set1> set2返回set1是否为set2的超集(相应的严格) set1 | set2返回两个记录集的并集,新记录集包含任何源中存在的所有记录 set1&set2返回两个记录集的交集,一个新记录集只包含两个源中都存在的记录 set1 - set2返回一个只包含不在set2中的set1记录的新记录集 其他记录集操作 记录集是可迭代的,所以通常的Python工具可用于transfo