0

タイトル文字列を含むデータモデルがある場合、次のように言います。

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と呼び、適切に編集してから、そのフィールドで並べ替えることです。しかし、私は動的なモデルの変更について読み始めたばかりであり、それを行う方法が明確ではありません(言うまでもなく、通常のモンキーパッチよりも少し不安定に見えます)。

extra3番目のオプションは、Djangoにクエリセットのオプションがあり、新しいフィールドを含むSQLを追加できることを読んでいました。編集されたタイトルを表す新しいSQLフィールドを追加する方法がわかりませんが、Django SQLはPython関数を呼び出すことができますか?

では、クエリセットを(変更された)タイトルで並べ替えるには、どのようなアプローチが最適でしょうか?

4

1 に答える 1

1

コメントの@bebrawは実際には正しいです。

特別なソート フィールドを作成する方法です。これは、SOLR などの検索フレームワークのカスタムでもあります。特別なテキスト分析を適用して、言語に従ってソートすることもできます。

あなたの場合、ストップ ワード (記事の短いリスト) を削除するのと同じくらい簡単な場合は、他のフィールドからデータをコピーしてストップ ワードを削除する通常のモデル フィールドを作成します。

通常の DB フィールドを使用する利点: DB インデックスを作成し (たとえば、UPPER(value) で)、DB インデックスでサポートされている大文字と小文字を区別せずに並べ替えることができます (並べ替えるには、QuerySet.extra で追加のフィールドを追加する必要があります)。 UPPER(値))。

これにより、高速にソートおよびページングされた結果が可能になります。Django ですべてを行う場合、データ全体を取得する必要があります。これは、数百行の場合には十分に高速ですが、データが増加するとまったく拡張できなくなります。

ただし、データによってはストップ ワードに注意してください。ストップ ワードの反例は、「To Be or Not To Be」というタイトルです。このタイトルは、簡単にストップ ワードとして分類できるもので完全に構成されており、そのようなフィルターを通過すると単純に消滅します。

于 2014-11-04T09:11:50.407 に答える