2010-01-06 37 views
2

考虑这个示例模型:排序显示名称,而不是实际值

MODEL_CHOICES =( (U “SPAM”,U “垃圾邮件”), (U “XOUP”,U “Eggsoup”) , )

(剪断)

类型= models.CharField(MAX_LENGTH = 4,选择= MODEL_CHOICES)

(实际实现特定领域和非英语的,所以这个样品必须做。)

当建立我的查询,我想通过类型字段对结果进行排序,和现在结果发送给用户。当然,我想按照该字段的显示名称排序。

东西线沿线的:

文件= MyModel.objects.filter(...)ORDER_BY( “类型”)

然而,[query-set].order_by([field])只允许由字段名排序,即使Eggsoup <垃圾邮件(给读者),也会导致垃圾邮件< XOUP(对计算机)。

考虑这一套按类型排序实例:

名称|类型

obj1 | SPAM

obj2 | SPAM

obj3 | SPAM

obj4 | XOUP

obj5 | XOUP

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

名称|类型

obj1 |垃圾邮件

obj2 |垃圾邮件

obj3 |垃圾邮件

obj4 | Eggsoup

obj5 | Eggsoup

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

在Django中是否有一个允许按显示名称排序的功能?或者一种方法来完成这个“手动”?(重命名的选择,这样的显示名称具有相同的数量级的实际值是不是一种选择。)

回答

4

如果结果集足够小,则可以在代码中执行内存中的结果排序。 我想不出任何体面的方式来排序数据库级别的结果。如果你使用了知道显示名称的存储过程,那肯定会有可能,但是你必须编写原始的sql。 至于手动sorting-你可以使用这样的事情:

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

+0

谢谢。运营商的使用看起来很漂亮,我不知道它。 – nikola 2010-01-07 11:47:37

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

+0

马克,感谢您的回答。但是,这不是关于选择的排序顺序,而是关于结果的顺序。我编辑了原始问题以澄清这一点。 – nikola 2010-01-06 18:36:56

+0

目前还不清楚你从哪里获取显示名称。这是模型的一部分吗? – 2010-01-06 19:06:10

+0

它的Django的功能 - 当你定义选择,因为二元组中,第一项将成为存储在表中的实际值,第二项是显示名称,其中,例如,被在管理使用或从模型创建表单时。在这里看到: http://www.djangoproject.com/documentation/models/choices/ – nikola 2010-01-06 23:52:08

相关问题