1

私は現在、Django 1.10.3、elasticsearch バックエンドを備えた django-haystack 検索エンジン、および drf-haystack を使用してビューを証明しています。

一般的に検索は素晴らしいものでしたが、現在のユーザーで結果をフィルタリングすることは完全にできません.

インデックスは次のとおりです。

class SectionIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(document=True, use_template=True, template_name="indexes/structure_text.txt")
    pkey = indexes.IntegerField(model_attr='pk')
    title = indexes.CharField()

ビューの場合 (HaystackSerializer も含まれますが、一般的なものであり、含める価値はありません)。

class SectionSearchView(HaystackViewSet):
    index_models = [Section]
    serializer_class = SectionViewSerializer
    pagination_class = None
    filter_backend = SectionFilter

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def filter_queryset(self, queryset):
        queryset = super(HaystackGenericAPIView, self).filter_queryset(queryset)
        return queryset.using('section')

そして最後に、フィルター:

class SectionFilter(HaystackFilter):
    mine = django_filters.MethodFilter(action='get_mine')

    class Meta:
        model = Section
        fields = ['mine']

    def get_mine(self, queryset, value):
        try:
            teacher = self.request.user.teacherprofile
            return queryset.filter(supervisors=teacher)
        except:
            return queryset

セクションには教師プロファイルを含む M2M フィールドがあり、基本的に、教師がスーパーバイザーにいるセクションのみが結果に含まれるようにしたいと考えています。

この実装は、一致するすべてのクエリを返しますが、フィルター条件を無視し、エラーをスローすることはありません。

私が得た「最良の」結果は、ビューで filter_queryset をいじり、クエリセットに .filter(supervisors=teacher) を追加しようとしたことですが、教師がスーパーバイザーであるすべてのセクションに加えて、すべてのコースが返されましたスーパーバイザーのステータスに関係なく、クエリに一致します。

4

1 に答える 1

2

そのため、一日の終わりに、私は最終的に SearchQuerySet を使用してクラスの結果を返し、結果をリストに変換して、教師がスーパーバイザーとしていない状態で項目を削除しました。

これはおそらく最も効率的な方法ではなく、Haystack だけで (filter_and(name, Supervisor) 条件で SQS を使用しても) 動作させることはできませんでしたが、動作し、それでも十分なパフォーマンスを発揮します。

于 2016-11-18T16:02:42.060 に答える