合并记录集
实现
1 将两个记录集合并为一个并保留排序,使用如下操作:
result = recordset1 + recordset2
2 使用如下操作合并两个记录集并确保结果中没有重复内容:
result = recordset1 | recordset2
3 使用如下操作来查找两个记录集中共同的记录:
result = recordset1 & recordset2
运行原理
针对记录集的类实现了不同的Python运算符的重定义,在此处进行了使用。以下为可用于记录集的最有用的Python运算符的总结表:
运算符 执行操作
R1 + R2 | 它返回一个包含 R1中记录的新记录集,后面跟 R2中的记录。这可能会产生记录集中的重复记录 |
R1 - R2 | 它返回一个包含 R1中记录但不包含 R2中记录的新记录集。保留原有排序。 |
R1 & R2 | 它返回一个既属于 R1又属于 R2的记录的新记录集(记录集的交集)。不保留原有排序。 |
R1 I R2 | 它返回一个或属于 R1或属于 R2的记录的新记录集(记录集的并集)。不保留原有排序,且没有重复值。 |
R1 == R2 | 如果两个记录集中包含相同的记录则返回 True。 |
R1 <= R2 R1 in R2 | 如果 R1的记录也存在于 R2中返回 True。两种语法异曲同工。 |
R1 >= R2 R2 in R1 | 如果 R2的记录也存在于 R1中返回 True。两种语法异曲同工。 |
R1 != R2 | 如果R1和 R2不包含相同记录返回 True。 |
还有些赋值运算符+=, -=, &=和
|=,它们会修改左侧的运算项而不会新建记录集。在更新记录的One2many或Many2many字段时这些会非常的有用。
过滤记录集
filter()
记住filter()是在内存中进行运算。如果你尝试对关键路径上的方法进行性能优化,可能会要使用搜索域或者甚至是转向SQL,代价是损失代码易读性。
遍历记录集
mapped()
在使用mapped()时,要记住它在Odoo服务的内存中进行操作,该服务返利地遍历关联并因此产生很多SQL查询,这可能会影响效率。但是这种代码很直白且具备表达性。如果你在尝试优化实例关键路径上的方法提高性能的话,可能会要重写调用为mapped()并以相应的域来以search()进行表达,甚至是转向SQL(代价是损失代码易读性)。
mapped()方法也可以通过函数作为参数来进行调用。这种情况下,它返回包含应用于self每条记录的函数的结果列表,或者返回在函数返回的是记录集的情况下由该函数返回的记录集的并集。