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。这是有问题的。我希望有人知道更好的方法。不幸的是,根据公认的答案,没有后端不可知的方法来执行此类查询。我刚得到一个可能有用但有点粗糙的想法。复制数据(即,存储标题时不带标题等),并将其用于排序。工作,但男人是丑陋的。