본문 바로가기

web/Django_rest_framework

8 pagination


이번 포스팅은 앞써 post list화면의 페이지 네이션을 적용하겠습니다.


해당 포스팅에서의 소스파일은 아래 링크에서 확인 가능합니다.

https://github.com/uiandwe/django_rest_api/tree/a923a4cc3c7666c46685021c30ae78292abd91eb



1. 먼저 /posts/api/views.py 파일에서 rest_framework.pagination 과 PostListAPIView()함수에 페이지네이션을 사용한다는 선언을 해줘야 합니다. 


pagination_class는 사용자가 지정한 limit 값만큼 해당 데이터갯수를  혹은 offset으로 지정한 해당 페이지를 돌려줍니다.

자세한 내용은 링크 참조!

http://www.django-rest-framework.org/api-guide/pagination/#modifying-the-pagination-style


from rest_framework.pagination import LimitOffsetPagination, PageNumberPagination

class PostListAPIView(ListAPIView):
serializer_class = PostSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ['title', 'content']
pagination_class = LimitOffsetPagination

def get_queryset(self, *args, **kwargs):
queryset_list = Post.objects.all()
query = self.request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(user__first_name__icontains=query) |
Q(user__last_name__icontains=query)
).distinct()
return queryset_list


2.  /api/posts/?limit=2 링크로 실행해보면 아래 화면과 같이 2개의 데이터만을 리턴하는것을 확인할수 있습니다. 





3. /api/posts/?limit=2&offset=2






3. 이번엔 사용자 지정이 아닌 서버내에서 지정하여 작동하게끔 해보겠습니다.


    post/api/pagination.py 파일 생성 후 아래의 소스를 넣어줍니다.

    

   아래의 default_limit의 경우는 특별히 지정되지 않는다면 2개씩 페이지네이션 결과값을 줍니다.

  max_limit의 경우는 사용자가 limit 값으로 지정시의 최대 값으로 사용자가 10 이상을 요청해도 최대 10개씩 돌려줌 입니다.

from rest_framework.pagination import LimitOffsetPagination, PageNumberPagination


class PostLimitOffsetPagination(LimitOffsetPagination):
max_limit = 10
default_limit = 2




4. 위에서 만든 파일을 참조 및 pagination_class에 넣어줍니다.


from post.api.pagination import PostLimitOffsetPagination

class PostListAPIView(ListAPIView):
serializer_class = PostSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ['title', 'content']
pagination_class = PostLimitOffsetPagination

def get_queryset(self, *args, **kwargs):
queryset_list = Post.objects.all()
query = self.request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(user__first_name__icontains=query) |
Q(user__last_name__icontains=query)
).distinct()
return queryset_list


5. 다시 /api/posts/를 확인 하면 아까와 같이 2개씩 페이지네이션이 작동하는것을 볼 수 있습니다.


'web > Django_rest_framework' 카테고리의 다른 글

django REST_FRAMEWORK login  (0) 2019.01.11
9. href  (0) 2016.07.30
7 search  (0) 2016.07.28
6 저장/수정시 유저 저장  (0) 2016.07.27
5. create  (0) 2016.07.27