2

考虑这个示例模型:

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

(剪断)

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

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

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

类似于以下内容:

文档 = MyModel.objects.filter(...).order_by("type")

但是,[query-set].order_by([field])只允许按字段名称排序,这将导致 SPAM < XOUP(对机器),即使 Eggsoup < Spam(对人类阅读器)。

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

姓名 | 类型

对象1 | 垃圾邮件

对象2 | 垃圾邮件

obj3 | 垃圾邮件

obj4 | XOUP

obj5 | XOUP

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

姓名 | 类型

对象1 | 垃圾邮件

对象2 | 垃圾邮件

obj3 | 垃圾邮件

obj4 | 蛋汤

obj5 | 蛋汤

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

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

4

2 回答 2

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

于 2010-01-06T19:37:21.210 回答
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 有一个很好的示例,可以对第二个元素的元组列表进行排序。

于 2010-01-06T18:05:43.023 回答