如何从haystack搜索中序列化django-rest-framework中的分页对象?

问题描述 投票:2回答:2

我目前使用以下视图和序列化程序获得以下分页结果:

views.朋友

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
        results = EmptySearchQuerySet()

        if request.GET.get('q') is not None:
            query = request.GET.get('q')
            sqs = SearchQuerySet().filter(content=query)
            paginator = Paginator(sqs, 10)

            page = request.QUERY_PARAMS.get('page')
            try:
                results = paginator.page(page)
            except PageNotAnInteger:
                results = paginator.page(1)
            except InvalidPage:
                results = paginator.page(paginator.num_pages)

        return results

serialize认识.朋友

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

class PaginatedDotaSearchItemsSerializer(pagination.PaginationSerializer):

    """
    Serializes page objects of results querysets.
    """
    start_index = serializers.SerializerMethodField('get_start_index')
    end_index = serializers.SerializerMethodField('get_end_index')
    num_pages = serializers.Field(source='paginator.num_pages')

    class Meta:
        object_serializer_class = DotaSearchSerializer

    def get_start_index(self, page):
        return page.start_index()

    def get_end_index(self, page):
        return page.end_index()

    def get_curr_page(self, page):
        return page.number

现在我不确定我的分页序列化程序是否设置正确,但我如何让它在结果查询中序列化分页对象。

谢谢

django pagination django-rest-framework django-haystack
2个回答
3
投票

好吧,我希望我更详细地阅读文档,我发现ListModelMixin带有一个分页属性以及一个定义自定义分页序列化程序的属性。

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

    serializer_class = DotaSearchSerializer
    permission_classes = (IsAuthenticated,)
    authentication_classes = (SessionAuthentication, BasicAuthentication)
    paginate_by = 10
    pagination_serializer_class = PaginatedDotaSearchItemsSerializer

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

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

        return sqs

class PaginatedDotaSearchItemsSerializer(pagination.PaginationSerializer):

    """
    Serializes page objects of results querysets.
    """
    start_index = serializers.SerializerMethodField('get_start_index')
    end_index = serializers.SerializerMethodField('get_end_index')
    num_pages = serializers.Field(source='paginator.num_pages')
    current_page = serializers.SerializerMethodField('get_curr_page')

    class Meta:
        object_serializer_class = DotaSearchSerializer

    def get_start_index(self, page):
        return page.start_index()

    def get_end_index(self, page):
        return page.end_index()

    def get_curr_page(self, page):
        return page.number

0
投票

如果你使用source='XXXXXX'那么你应该这样做;

serializers.ReadOnlyField(source='paginator.num_pages')
© www.soinside.com 2019 - 2024. All rights reserved.