如何排序Django模型对象的字母数字列表

时间:2011-03-14 05:29:26

标签: python django sorting

我试图将How to sort alpha numeric set in python中提出的问题的答案移植到Django。我有一个查询返回的Django模型实例列表,我无法弄清楚如何使用lambda构建一个优雅(或其他!)排序函数。

如果我的模型包含'name'属性 - 例如

result = Take.objects.all()
for i in result:
   print i.name

如何通过name属性对结果对象列表进行排序并应用多个测试?

即。我的名字值可能是'1A','1','A1','001A'等

e.g。  给出这个排序(基于名称)

1A
2A
10A
A1
A2
A10
A11
B2
B4

3 个答案:

答案 0 :(得分:5)

使用operator.attrgetter按属性值对对象进行排序:

import operator

class Foo:
    def __init__(self, name):
        self.name = name

l = [Foo('AA'), Foo('a'), Foo('AB')]
l.sort(key=operator.attrgetter('name'))
print [o.name for o in l]
['AA', 'AB', 'a']

这是我提供which defines a function以“人类”顺序执行字母数字排序的另一个答案。将_human_key函数合并到上面的示例中,您可以执行以下操作:

l.sort(key=lambda x: _human_key(x.name))
print [o.name for o in l]
['a', 'AA', 'AB']

答案 1 :(得分:0)

试试这个:

result = Take.objects.order_by('name')
for x in result:
    print x

但是,您提到的示例排序不是我所知道的正常字母数字(词典)排序。相反,它将是:

10A
1A
2A
A1
A10
A11
A2
B2
B4

如果您真的想要指定的订单,则必须更具创意。

答案 2 :(得分:0)

我遇到了类似的问题,我尝试以类似的方式订购Queryset 尽管我使用自定义函数来完成订单

1AreaDesk。
2-1-1桌面。
10AreaDesk。
AreaDesk。
Desk1

我意识到使用Django的Lower函数会产生相同的结果 从django.db.models.functions导入Lower

例如

Model.objects.filter(**filter_query).order_by(Lower("attribute_name")