2010-01-06 35 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

相關問題