我目前正在使用 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) 添加到查询集中,但这让我返回了以老师为主管的所有部分,以及所有课程匹配查询,无论主管身份与否。