[英]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.