将django-haystack与django-rest-framework集成?

12
我想知道如何使用django-rest-framework来提供一个分页的json结果从一个get请求 q=thisterm。我理解使用 SearchQuerySet.filter(content=q) 来操作 haystack,但是我不确定如何对这个queryset进行序列化和创建一个api视图。我不知道应该使用哪个viewset以及在rest端需要执行的基本逻辑。感谢任何帮助。谢谢。
1个回答

14

经过多次试验和错误,我找到了正确的组合!这是一个开始。

定义一个序列化器:serializers.py

class DotaSearchSerializer(serializers.Serializer):
    text = serializers.CharField()
    name = serializers.CharField()
    quality = serializers.CharField()
    type = serializers.CharField()
    rarity = serializers.CharField()
    hero = serializers.CharField()
    image = serializers.CharField()
    desc = serializers.CharField()

创建视图:views.py

class DotaSearchViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):

    serializer_class = DotaSearchSerializer
    permission_classes = (IsAuthenticated,)
    authentication_classes = (SessionAuthentication, BasicAuthentication)

    def get_queryset(self, *args, **kwargs):
        request = self.request
        queryset = EmptySearchQuerySet()

        if request.GET.get('q') is not None:
            query = request.GET.get('q')
            queryset = SearchQuerySet().filter(content=query)

        return queryset

请注意您可能需要清理输入并执行其他安全检查。

将其路由到:urls.py

router.register(r'search', api_views.DotaSearchViewSet, base_name='search')

1
这真的非常有帮助。谢谢。你能告诉我如何将结果计数添加到输出的JSON中吗? - Brandon Brown
请查看Django REST框架的Haystack:https://github.com/inonit/drf-haystack - Daviddd
从HayStack的SearchQuerySet获取所需结果了吗? 在使用HayStack视图(在搜索表单的情况下)时是否遵循相同的机制,或者可能存在任何性能差异? - Shaurya Chaudhuri
不应该使用return queryset,而应该使用以下代码: return self.queryset.filter(pk__in=queryset.values_list('pk', flat=True))在某些情况下,返回查询集可能有效,但这并不是 haystack 查询集的预期用法。例如,当 permission_classes 设置为 DjangoModelPermissions 时,Deep 的代码将失败。 - Irvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接