私は現在、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) を追加しようとしたことですが、教師がスーパーバイザーであるすべてのセクションに加えて、すべてのコースが返されましたスーパーバイザーのステータスに関係なく、クエリに一致します。