odoo python:当orderby不能满足我们对排序的要求(前提:需要排序的orderby组合较少)

假设,我们需要对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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值