给定带有标题字符串的数据模型,请说:
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函数吗?
那么什么方法(如果有的话)最适合用(修改)标题对查询集进行排序?
答案 0 :(得分:1)
评论中的@bebraw实际上是对的。
创建一个特殊的排序字段就是这样做的。这也是SOLR等搜索框架的自定义。您甚至可以应用特殊文本分析来根据语言进行排序。
在您的情况下,如果它只是删除停用词(文章的简短列表)一样简单,您将创建一个常规模型字段,从另一个字段复制数据并删除停用词
使用常规数据库字段的好处:您可以创建数据库索引(例如,在UPPER(值)上)并且能够对数据库索引支持的不区分大小写进行排序(您必须使用QuerySet添加额外的字段。额外的以对UPPER(值)进行排序。)
这将允许快速排序和分页结果。如果您在Django中执行所有操作,则必须检索整个数据。对于数百行,这可能足够快,但如果数据增加则根本不会扩展。
但是: 根据您的数据,请注意停用词。阻止单词的反例是标题"成为或不成为"它完全由您可能轻易归类为停用词的内容组成,并且在运行这样的过滤器时会被简单地消灭。