给定一个带有标题字符串的数据模型,比如说:
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 函数吗?
那么什么方法(如果有的话)最适合按(修改的)标题对查询集进行排序?