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

Django 按显示名称而不是实际值排序,django,sorting,django-queryset,Django,Sorting,Django Queryset,考虑以下示例模型: 模型_选项=( (u“垃圾邮件”,u“垃圾邮件”), (u“xoop”,u“eggshop”), ) (剪报) type=models.CharField(最大长度=4,选项=MODEL\u选项) (实际的实现是特定于领域的,并且是非英语的,所以这个示例必须这样做。) 在构建查询时,我希望按该类型字段对结果进行排序,并将结果呈现给用户。当然,我想按该字段的显示名称进行排序 大致如下: documents=MyModel.objects.filter(…).order\u by

考虑以下示例模型:

模型_选项=( (u“垃圾邮件”,u“垃圾邮件”), (u“xoop”,u“eggshop”), )

(剪报)

type=models.CharField(最大长度=4,选项=MODEL\u选项)

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

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

大致如下:

documents=MyModel.objects.filter(…).order\u by(“类型”)

但是,
[query set].order_by([field])
只允许按字段名排序,这将导致垃圾邮件 考虑按类型排序的这组实例:

名称|类型

obj1 |垃圾邮件

obj2 |垃圾邮件

obj3 |垃圾邮件

obj4 | xoop

obj5 | xoop

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

名称|类型

obj1 |垃圾邮件

obj2 |垃圾邮件

obj3 |垃圾邮件

obj4 |蛋汤

obj5 |蛋汤

在人类用户的眼中,这是没有正确排序的


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

假设显示名称也来自模型,则您可以按该字段排序,以按您想要的顺序排列选项

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排序进行排序。对第二个元素上的元组列表进行排序的过程。

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

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

下面是一些关于如何在Python中对列表排序的好例子:

Mark,谢谢您的回答。然而,这不是关于选择的排序顺序,而是关于结果的顺序。我编辑了原始问题以澄清这一点。我仍然不清楚您从何处获得显示名称。这是模型的一部分吗?这是Django的一个特性-当您将选项定义为两个元组时,第一项成为存储在表中的实际值,第二项是显示名称,例如,它在管理中或从模型创建表单时使用。看这里:是的,我明白。我的问题是你如何定义选择?您是将它们定义为常量还是从查询集生成选择?我将它们定义为常量。不过,在模型中重新订购并不能解决上述问题。谢谢。接线员的使用看起来很漂亮,我没有意识到。