考虑这个样本模型:
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中是否有允许按显示名称排序的功能?还是一种“手动”完成此操作的方法? (重命名选项以使显示名称与实际值具有相同的顺序。)
答案 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对第二个元素上的元组列表进行排序。