2014-09-03 58 views
1

我當前使用下面的視圖和串行下面分頁結果:如何從乾草堆搜索序列化django-rest-framework中的分頁對象?

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

serializers.py

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 

現在我不知道我的分頁序列化器設置正確,但是如何獲取它以在我的結果查詢中序列化分頁對象。

感謝

回答

2

嗯,我想我閱讀更詳細的文檔,我只是發現了這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') 
相關問題