【问题标题】:Integrating django-haystack with django-rest-framework?将 django-haystack 与 django-rest-framework 集成?
【发布时间】:2014-10-24 18:11:40
【问题描述】:

我想知道,如何使用 django-rest-framework 从获取请求 q=thisterm 中提供分页的 json 结果。

我了解使用SearchQuerySet.filter(content=q) 的事情的大海捞针,但是如何使用此查询集序列化和创建 api 视图。我不确定要使用哪个视图集,也不确定在其余部分我需要做什么背后的基本逻辑。

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: django django-rest-framework django-haystack


    【解决方案1】:

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

    定义一个序列化器: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')
    

    【讨论】:

    • 这非常有帮助。谢谢。你能告诉我如何将结果计数添加到输出的 JSON 中吗?
    • 看看 Haystack 的 Django REST 框架:github.com/inonit/drf-haystack
    • 您从 HayStack 的 SearchQuerySet 中获得了所需的结果?这是否与使用 HayStack 视图时遵循的机制相同(在搜索表单的情况下)还是可能存在任何性能差异?
    • 而不是return queryset,应改为执行以下操作:return self.queryset.filter(pk__in=queryset.values_list('pk', flat=True)) 虽然返回查询集在某些情况下可能有效,但这不是大海捞针查询集的预期用途。例如,当 permission_classes 设置为 DjangoModelPermissions 时,Deep 的代码会失败。
    • 这很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2017-08-18
    • 2016-09-24
    • 2018-01-07
    相关资源
    最近更新 更多