2017-10-04 130 views
1

定製PAGE_SIZE我有一個list_route:Django的REST框架,爲list_route行動

@list_route(methods=['get']) 
    def bought(self, request): 
     bought_photos = Photo.objects.filter(is_bought=True) 

     page = self.paginate_queryset(bought_photos) 
     if page is not None: 
      serializer = self.get_serializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 
     serializer = self.get_serializer(bought_photos, many=True) 
     return Response(serializer.data) 

我如何可以設置自定義PAGE_SIZE只爲list_route,而不是它的ModelViewSet?

SOLUTION

1)創建CustomPagination類

from rest_framework.pagination import PageNumberPagination 

class CustomPagination(PageNumberPagination): 
    page_size = 10000 
    page_size_query_param = 'page_size' 

2)編輯list_route代碼:

@list_route(methods=['get']) 
    def bought(self, request): 
     bought_photos = Photo.objects.filter(is_bought=True) 
     paginator = CustomPagination() 

     page = paginator.paginate_queryset(bought_photos, request) 
     if page is not None: 
      serializer = self.get_serializer(page, many=True) 
      return paginator.get_paginated_response(serializer.data) 
     serializer = self.get_serializer(bought_photos, many=True) 
     return Response(serializer.data) 

回答

1

我認爲下面的代碼應該足夠:

@list_route(methods=['get'], pagination_class=CustomPagination) 
def bought(self, request): 
    bought_photos = Photo.objects.filter(is_bought=True) 

    page = self.paginate_queryset(bought_photos) 
    if page is not None: 
     serializer = self.get_serializer(page, many=True) 
     return self.get_paginated_response(serializer.data) 
    serializer = self.get_serializer(bought_photos, many=True) 
    return Response(serializer.data) 
+0

不錯!謝謝!你在哪裏閱讀這是可能的? – user1518217

+0

這是一個非常簡短的提及在[文檔](http://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing)「裝飾可以額外採取額外只有路由視圖纔會設置參數,例如......「 – Linovia

+0

我很驚訝地看到關於一些非常高級主題和某種隱藏功能的框架的優秀答案。這個答案一直沒有兌現是一個恥辱。只有一點意見:'page'應該是'list'類型,所以它不能是'None',所以它總是會進入if子句。如果列表爲空,那麼它不應該輸入if-子句,因此條件最好是'if page:'。或者也許我有什麼問題? – cezar