0

给定一个带有标题字符串的数据模型,比如说:

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”,)。因此,“The Incredibles”将排在“A River Runs Upstream”等之前。我不想只截断数据库或结果视图中的数据。我想为查询集创建一个内部自定义排序。

一种似乎可行的方法是创建一个自定义更改列表,然后在那里查询集进行排序,如下所示:

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 函数吗?

那么什么方法(如果有的话)最适合按(修改的)标题对查询集进行排序?

4

1 回答 1

1

评论中的@bebraw 实际上是正确的。

创建一个特殊的排序字段就是这样做的。这也是 SOLR 等搜索框架的自定义。您甚至可以应用特殊的文本分析来根据语言进行排序。

在您的情况下,如果就像删除停用词(文章的简短列表)一样简单,您将创建一个常规模型字段,从另一个字段复制数据并删除停用词。

使用常规 DB 字段的好处:您可以创建一个 DB 索引(例如,在 UPPER(value) 上)并能够对 DB 索引支持的不区分大小写进行排序(您必须使用 QuerySet.extra 添加一个额外的字段来排序上(值))。

这将允许快速排序和分页结果。如果你在 Django 中做所有事情,你将不得不检索整个数据。对于数百行来说,这可能足够快,但如果数据增加,则根本无法扩展。

但是:根据您的数据小心停用词。停用词的反例是标题“To Be or Not To Be”,它完全由您可能很容易归类为停用词的内容组成,并且在通过这样的过滤器时会被简单地消灭。

于 2014-11-04T09:11:50.407 回答