2012-09-22 66 views
0

考慮到與標題字符串的數據模型,說:如何自定義排序的Django的queryset

class DVD(models.Model): 
    title = models.CharField(max_length=100) 
class DVDAdmin(admin.ModelAdmin): 
    ordering = ('title',) 

sample_titles = {"A Fish Called Wanda", "The Good, the Bad, and the Unsorted", 
       "A River Runs Upstream", "The Incredibles",} 

我要生成按標題排序的查詢集,但考慮到標題減去開頭的單詞都在列表,例如(「a」,「an」,「the」,)。因此,「超人」將在「河上游運行」之前排序,等等。我不想僅僅在數據庫或結果視圖中截取數據。我想爲查詢集創建一個內部自定義排序。這似乎是它威力工作

一種方法,是創建一個自定義更改列表,則排序查詢集,如:

from django.contrib.admin.views.main import Changelist 
class title_sortlist(Changelist): 
    def apply_special_ordering(self, queryset): 
     qs_desc = self.models.objects.all().order_by('-title') 
     return qs_desc 
    def get_query_set(self, request, *args, **kwargs): 
     queryset = super(title_sortlist, self).get_query_set(request) 
     queryset = self.apply_special_ordering(queryset) 
     return queryset 

class DVDAdmin(admin.ModelAdmin): 
    ordering = ('title',) 
    def get_changelist(self, request, **kwargs): 
     return title_sortlist 

本工程爲標準排序 - 降序排序確實覆蓋模型升序排序。但是,我還沒有弄清楚如何將查詢集和自定義排序。

另一種可能性是動態由字段的字段添加到模型,稱之爲cut_title,適當編輯,然後只是排序。不過,我剛剛開始閱讀有關動態模型更改的內容,但不清楚該如何操作(更不用說,它看起來有點不可思議,比普通的猴子補丁更加如此)。

第三個選項,我讀的是Django對查詢集有一個extra選項,您可以在其中添加其他SQL,包括新字段。我不知道如何添加一個代表編輯標題的新SQL字段 - 可以使用Django SQL調用Python函數嗎?

那麼用什麼辦法,如果有的話,將排序由(修改)標題查詢集是最好的?

+0

相關:http://stackoverflow.com/questions/883575/custom-ordering-in-django。 –

+0

@bebraw,可能相關,但不是解決方案 - 「排序」方法顯然不返回一個查詢集。 –

+0

確實如此。這是有問題的。我希望有人知道更好的方法。不幸的是,根據接受的答案,沒有後端不可知的方式來執行這些查詢。 –

回答

0

@bebraw的評論其實是對的。

創建一個特殊的排序字段是如何完成的。這也適用於像SOLR這樣的搜索框架。你甚至可以應用特殊的文本分析來根據語言進行排序。

對於您的情況,如果只是刪除停用詞(短文章列表),您可以創建一個常規模型字段,從其他字段複製數據並刪除停用詞。

使用常規數據庫字段的好處是:您可以創建數據庫索引(例如,在UPPER(值)上)並且能夠對數據庫索引支持的不區分大小寫的字符進行排序(您將不得不在QuerySet中添加額外的字段.extra在UPPER(值)上排序)。

這將允許快速排序和分頁結果。如果你在Django中做所有事情,你將不得不檢索整個數據。這對於數百行可能足夠快,但如果數據增加則根本無法擴展。

但是: 小心取決於您的數據停用詞。停止言語的反例是標題「To Be Not To Be」,它完全由你可能很容易歸類爲停用詞的詞組組成,並且在通過這樣的過濾器時簡單地被殲滅。

相關問題