按显示名称而不是实际值排序

时间:2010-01-06 17:40:28

标签: django sorting django-queryset

考虑这个样本模型:

  

MODEL_CHOICES =(       (你是“垃圾邮件”,你是“垃圾邮件”),       (你是“XOUP”,你是“Eggsoup”),   )

(剪断)

  

type = models.CharField(max_length = 4,choices = MODEL_CHOICES)

(实际的实现是特定于域的,非英语的,所以这个样本必须这样做。)

构建查询时,我想按类型字段对结果进行排序,并将结果显示给用户。当然,我想按该字段的显示名称排序。

有些事情:

  

documents = MyModel.objects.filter(...)。order_by(“type”)

但是,[query-set].order_by([field])仅允许按字段名称排序,这将导致SPAM< XOUP(到机器)即使Eggsoup<垃圾邮件(给人类读者)。

考虑按类型排序的这组实例:

  

姓名|型

     

obj1 | SPAM

     

obj2 | SPAM

     

obj3 | SPAM

     

obj4 | XOUP

     

obj5 | XOUP

但这是用户将看到的顺序,即用户将看到显示名称,而不是类型列的内部字段值:

  

姓名|型

     

obj1 |垃圾邮件

     

obj2 |垃圾邮件

     

obj3 |垃圾邮件

     

obj4 | Eggsoup

     

obj5 | Eggsoup

在人类用户眼中没有正确排序。

Django中是否有允许按显示名称排序的功能?还是一种“手动”完成此操作的方法? (重命名选项以使显示名称与实际值具有相同的顺序。)

2 个答案:

答案 0 :(得分:4)

如果结果集足够小,您可以在代码中执行内存中的结果排序。 我想不出有任何像样的方法来对数据库级别的结果进行排序。如果你使用知道显示名称的存储过程肯定是可能的,但是你必须编写原始的sql。 至于手动分拣 - 您可以使用以下内容:

obj_list = list(Model.objects.all())
import operator
obj_list.sort(key=operator.methodcaller('get_foo_display'))

以下是一些关于如何在Python中对列表进行排序的好例子:http://wiki.python.org/moin/HowTo/Sorting

答案 1 :(得分:0)

假设显示名称来自模型,那么您可以按该字段排序,以便按照您的需要订购选项。

MODEL_CHOICES = MyModel.objects.all().values_list('value_field', 'display_field').order_by('display_field')
...
type = models.CharField(max_length=4, choices=MODEL_CHOICES)

如果您的问题中的选项是常数,那么您只需更改常量中的顺序即可。

MODEL_CHOICES = ((u"XOUP", u"Eggsoup"), (u"SPAM", u"Spam"), )

最后选择只是一个元组列表,因此您可以使用普通的Python排序进行排序。 Python wiki has a nice example对第二个元素上的元组列表进行排序。