0

django-autocomplete-lightフィールドで検索しているアイテムの長いリストがあり、オートコンプリートは次のように定義されています。

class OccupationAutocomplete(autocomplete_light.AutocompleteModelBase):
    model = models.Occupation
    search_fields=['title',]

一部の役職は、アルファベット順でリストのかなり先に位置しています。たとえば、次のようになります。

"先生"

次のような他の「あまり理想的ではないタイトル」の後に続きます。

「農業の先生」「建築の先生」「建築の先生」など…

私が望むのは、検索のテキストで始まる最も近いまたは単に一致する「最良の」一致のためです。したがって、誰かが「教える」を検索すると、同じ文字で始まるため、「教師」が得られます。その後、他の精度の低い一致が続きます。

search_fields優先順位で設定してみた

    search_fields=['^title','title',]

しかし、オートコンプリート コードを分析すると、返される前にすべての用語が 1 つのクエリに変更されていることがわかります。

このリストをより適切な方法で並べ替えるにはどうすればよいでしょうか?

4

1 に答える 1

0

最後に、新しいクラスを実装する必要がありました。これは、「優先ウェイト」の順に辞書のリストを受け入れ、それに基づいて結果を返すだけです。

class OrderedAutocomplete(autocomplete_light.AutocompleteModelBase):
    ordered_search_fields = []

    def choices_for_request(self):
        """
        Return a queryset based on :py:attr:`choices` using options
        :py:attr:`split_words`, :py:attr:`search_fields` and
        :py:attr:`limit_choices`.
        """
        assert self.choices is not None, 'choices should be a queryset'
        q = self.request.GET.get('q', '')
        exclude = self.request.GET.getlist('exclude')

        base_split_words = self.split_words

        _choices = []
        for weight,opt in enumerate(self.ordered_search_fields):
            if len(_choices) >= self.limit_choices:
                break

            search_fields = opt['search_fields']
            self.split_words = opt['split_words'] or base_split_words

            conditions = self._choices_for_request_conditions(q,
                    search_fields)
            choices = self.order_choices(self.choices.filter(conditions).exclude(pk__in=exclude))
            if choices.count():
                _choices += list(choices)[0:self.limit_choices]

        return _choices[0:self.limit_choices]

これは、次を使用してインスタンス化できます。

class OccupationAutocomplete(OrderedAutocomplete):
    model = models.Occupation

    ordered_search_fields = [
        {'search_fields': ['^title'], 'split_words':False},
        {'search_fields': ['title'], 'split_words':True},
        ]
autocomplete_light.register(OccupationAutocomplete)
于 2015-11-02T23:29:57.450 に答える