Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何自定义Django查询集排序_Python_Django_Django Queryset - Fatal编程技术网

Python 如何自定义Django查询集排序

Python 如何自定义Django查询集排序,python,django,django-queryset,Python,Django,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 R

给定带有标题字符串的数据模型,例如:

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”)。所以“不可置信”会在“河流上游”之前排序,等等。我不想只是截断数据库或结果视图中的数据。我想为QuerySet创建一个内部自定义排序

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

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为QuerySet提供了一个
额外的
选项,您可以在其中添加额外的SQL,包括新字段。我不知道如何添加一个新的SQL字段来表示编辑过的标题,也许Django SQL可以调用Python函数吗


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

@bebraw在评论中的做法实际上是正确的

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

在您的情况下,如果只需删除停止字(一个简短的文章列表),您就可以创建一个常规的模型字段,从另一个字段复制数据并删除停止字

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

这将允许快速排序和分页结果。如果您在Django中执行所有操作,则必须检索整个数据。这对于数百行来说可能足够快,但如果数据增加,则根本无法扩展

然而:
根据您的数据,小心使用停止词。停止单词的反例是标题“是或不是”,它完全由您可能很容易归类为停止单词的内容组成,并且在运行这样的过滤器时会被忽略。

Related:。@bebraw,Related maybe,但不是一个解决方案-
sorted
方法显然不会返回queryset.True。这是有问题的。我希望有人知道更好的方法。不幸的是,根据公认的答案,没有后端不可知的方法来执行此类查询。我刚得到一个可能有用但有点粗糙的想法。复制数据(即,存储标题时不带标题等),并将其用于排序。工作,但男人是丑陋的。