我需要使用三个不同的模型字段和一个属性以非常特定的方式排序特定模型的实例列表:field1 > field2 > property > field3
。
如果他们只是字段我可以照常做到:
queryset.order_by('field1', 'field2', 'field3')
但是因为我正在介绍一个属性,所以我不能在order_by
中使用它。
因此,我需要做的是强制执行该命令,即按每个属性进行排序和分组,并以非常丑陋的方式附加到结果列表中:
lst = list(queryset)
sorted_list = []
# sort and group by field1
sorted_by_field1 = sorted(lst, key=attrgetter('field1'))
for field1, field1_grp in groupby(sorted_by_field1, key=attrgetter('field1')):
# sort and group by field 2
sorted_by_field2 = sorted(list(field1_grp), key=attrgetter('field2'))
for field2, field2_grp in groupby(sorted_by_field2, key=attrgetter('field2')):
# sort and group by property
sorted_by_prop = sorted(list(field2_grp), key=attrgetter('property'))
for prop, prop_grp in groupby(sorted_by_prop, key=attrgetter('property')):
# final step: sort by the last involved attribute and extend the result list
sorted_list.extend(sorted(list(prop_grp), key=attrgetter('field3')))
正如你所看到的,这是对原始列表的排序非常迟钝,但我只是看不到另一种选择。有什么干净的方法可以做到这一点吗?
答案 0 :(得分:0)
答案实际上在@DanielRoseman的评论中:
sorted(lst, key=lambda elem: (elem.field1, elem.field2, elem.property, elem.field3))
我完全错过了你可以用lambda expressin指定多个排序键。