假设,我们需要对type字段进行排序,type字段可取的值有:1、2、3、4、5,而我们需要的排序为:3 2 4 1 5,这时,使用orderby明显不能满足我们的需求,因此就需要稍微进行变通一下。
主要是利用了list列表添加新元素时,会在尾部添加,而遍历列表时,是从头部开始遍历的。
odoo:使用read_group函数
# 使用read_group函数先得到不同的分组的list列表groups,此时的分组是乱序的 groups = self.env['order.type'].read_group(domain=[], fields=['type'], groupby=['type'], lazy=False) # 使用new_groups对groups进行重新排序,使得排序后处理待上传记录的顺序为:3 2 4 1 5 new_groups = [] new_groups.extend([x for x in groups if x['type'] == 3]) new_groups.extend([x for x in groups if x['type'] == 2]) new_groups.extend([x for x in groups if x['type'] == 4]) new_groups.extend([x for x in groups if x['type'] == 1]) new_groups.extend([x for x in groups if x['type'] == 5]) # 此时的new_groups中的分组是按照我们想要的顺序:3 2 4 1 5排列的 # 然后根据分组的条件,在table中循环选出符合条件的记录集,并进行操作 for group in new_groups: queue = self.env['order.type'].search(args=group['__domain']) # __domain中包含了所有的过滤条件,并以domain表达式显示,因此可以在这里直接拿来用 print queue
python:跟上述的逻辑一样,只是操作的对象不同而已
# 首选得到distinct type sql = 'select distinct type from order_type' self.env.cr.execute(sql) groups = self.env.cr.dictfetchall() # 对groups进行重新排序,得到我们需要的顺序 new_groups = [] new_groups.extend([x for x in groups if x['type'] == 3]) new_groups.extend([x for x in groups if x['type'] == 2]) new_groups.extend([x for x in groups if x['type'] == 4]) new_groups.extend([x for x in groups if x['type'] == 1]) new_groups.extend([x for x in groups if x['type'] == 5]) # 通过sql得到我们需要的记录集,并进行操作 for group in groups: sql = 'select * from order_type where type = %s' % group['type'] self.env.cr.execute(sql) queue = self.env.cr.dictfetchall() print queue