タイトル文字列を含むデータモデルがある場合、次のように言います。
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"、)などのリスト内の先頭の単語を差し引いたものと見なします。したがって、「Mr。インクレディブル」は「ARiver Runs Upstream」などの前に並べ替えられます。データベースまたは結果のビューのいずれかで、データを切り捨てるだけでは不十分です。クエリセットの内部カスタムソートを作成したいと思います。
うまくいくと思われるアプローチの1つは、カスタムチェンジリストを作成し、そこでクエリセットを次のように並べ替えることです。
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
これは標準の並べ替えで機能します。降順の並べ替えは、モデルの昇順の並べ替えを上書きします。ただし、クエリセットを取得してカスタムソートする方法がわかりません。
もう1つの可能性は、モデルにフィールドを動的に追加し、それをcut_titleと呼び、適切に編集してから、そのフィールドで並べ替えることです。しかし、私は動的なモデルの変更について読み始めたばかりであり、それを行う方法が明確ではありません(言うまでもなく、通常のモンキーパッチよりも少し不安定に見えます)。
extra
3番目のオプションは、Djangoにクエリセットのオプションがあり、新しいフィールドを含むSQLを追加できることを読んでいました。編集されたタイトルを表す新しいSQLフィールドを追加する方法がわかりませんが、Django SQLはPython関数を呼び出すことができますか?
では、クエリセットを(変更された)タイトルで並べ替えるには、どのようなアプローチが最適でしょうか?