繁体   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