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 回答