이번 포스팅은 앞써 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 |