2016-03-06 21 views
10

Tôi có một đơn giản APIView, nhưng tôi không biết cách thiết lập pagination tại đây. Trong trường hợp này, tôi chọn một Event với pk nhất định, sau đó tôi nhận được tất cả các NewsItems được gán cho Event này.Django Rest Framework - APIView Pagination

pagination_class = LimitOffsetPagination hoạt động OK khi tôi xác định bộ truy vấn ở đầu trong ListCreateAPIView, cho ví dụ. queryset = Event.objects.all() nhưng không phải với tùy chỉnh get:

class EventNewsItems(APIView): 
    pagination_class = LimitOffsetPagination 

    def get(self, request, pk, format=None): 

     #user = request.user 
     event = Event.objects.get(pk=pk) 
     news = event.get_news_items().all() 

     serializer = NewsItemSerializer(news, many=True, context={'request':request}) 
     response = Response(serializer.data, status=status.HTTP_200_OK) 
     return response 

quyết:

def get(self, request, pk, format=None): 

    #user = request.user 
    event = Event.objects.get(pk=pk) 
    news = event.get_news_items().all() 
    paginator = LimitOffsetPagination() 
    result_page = paginator.paginate_queryset(news, request) 
    serializer = NewsItemSerializer(result_page, many=True, context={'request':request}) 
    response = Response(serializer.data, status=status.HTTP_200_OK) 
    return response 
+2

Xem lại cuộc thảo luận này, có vẻ như chàng trai này giải quyết vấn đề của bạn https://github.com/tomchristie/django-rest-framework/issues/ 3030 – inlanger

+0

Hey, @ user3128673 Tôi đã tự hỏi nếu bạn tìm thấy câu trả lời của tôi hữu ích. –

Trả lời

4

tôi đã tạo ra một Q&A style example về chủ đề này.
Dưới dạng tóm tắt sắp xếp:

Bằng cách sử dụng mã nguồn khung Django Rest Frameworks và cách xử lý phân trang, chúng tôi tạo cùng một phương pháp trong lớp xem của chúng tôi và chúng tôi sử dụng phương pháp mặc định:

Taken từ doc nêu trên:

from rest_framework.settings import api_settings 
from rest_framework.views import APIView 

class MyView(APIView): 
    queryset = OurModel.objects.all() 
    serializer_class = OurModelSerializer 
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS # cool trick right? :) 

    # We need to override get method to achieve pagination 
    def get(self, request): 
     ... 
     page = self.paginate_queryset(self.queryset) 
     if page is not None: 
      serializer = self.serializer_class(page, many=True) 
      return self.get_paginated_response(serializer.data) 

     ... Do other stuff needed (out of scope of pagination) 

    # Now add the pagination handlers taken from 
    # django-rest-framework/rest_framework/generics.py 

    @property 
    def paginator(self): 
     """ 
     The paginator instance associated with the view, or `None`. 
     """ 
    if not hasattr(self, '_paginator'): 
     if self.pagination_class is None: 
      self._paginator = None 
     else: 
      self._paginator = self.pagination_class() 
    return self._paginator 

    def paginate_queryset(self, queryset): 
     """ 
     Return a single page of results, or `None` if pagination is disabled. 
     """ 
     if self.paginator is None: 
      return None 
     return self.paginator.paginate_queryset(queryset, self.request, view=self) 

    def get_paginated_response(self, data): 
     """ 
     Return a paginated style `Response` object for the given output data. 
     """ 
     assert self.paginator is not None 
     return self.paginator.get_paginated_response(data) 
Các vấn đề liên quan