簡體   English   中英

如何自定義對Django查詢集的排序

[英]How to custom sort a 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函數嗎?

那么,哪種方法(如果有的話)最適合按(修改的)標題對查詢集排序?

評論中的@bebraw實際上是正確的。

創建一個特殊的排序字段是如何完成的。 這對於SOLR之類的搜索框架也是自定義的。 您甚至可以應用特殊的文本分析來根據語言進行排序。

對於您而言,如果只要刪除停用詞(文章的簡短列表)一樣簡單,則可以創建一個常規模型字段,該字段從另一個字段復制數據並刪除停用詞。

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

這將允許快速排序和分頁的結果。 如果您在Django中進行所有操作,則必須檢索整個數據。 這對於幾百行而言可能足夠快,但是如果數據增加則根本無法擴展。

但是:請謹慎使用停用詞,具體取決於您的數據。 停用詞的反例是標題“ To Be or Not To Be”,該標題完全由您容易分類為停用詞的內容組成,並且在通過此類過濾器時會被殲滅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM