- TIL. drf팀프로젝트(4) pagination 목차
[오늘한일]
- 장고 DRF 프로젝트 진행
[오늘 배운점]
어제까지 필수기능 작성을 마무리했고,
오늘부터는 추가기능구현에 돌입했다.
<페이지네이션>
팀원분께서 페이지네이션을 맡아서 작성해주셨는데 검토해보며 배운 내용이다.
우선 drf에는 페이지네이션을 내포하고있다.
그걸 사용했다. (기본 제공기능을 써보아서 좋다)
from rest_framework.pagination import PageNumberPagination
임포트 코드이다. 위 위치에 모듈이 존재하고있다.
이걸 바로 사용해도 되겠지만, paginations.py파일을 만들어서 커스텀을 만드는게 좋다.
페이지네이션 객체를 만들때 작성할 주요한 속성은 아래와 같다.
class ArticlePagination(PageNumberPagination):
page_size = 10
page_query_param = "page"
max_page_size = 100
페이지 사이즈로 페이지당 글 개수를 정한다.
query_param으로 쿼리문에 매개변수 이름이 뭔지 정한다. (기본 값은 'page')
max_page_size는 최대 페이지 개수이다.
작성한 페이지네이션 객체를 view에게 부여하면 된다.
class ArticleView(generics.ListCreateAPIView):
paginations_class = ArticlePagination
serializer_class = ArticleListSerializer
queryset = Article.objects.all()
이렇게 작성할수 있다.
첫줄은 마치 permission클래스 지정과 작성법이 비슷하다.
paginations_class로 페이지네이션 클래스를 지정한다.
serailizer_class로 뷰 전용 serializer를 지정한다.
페이지네이션을 동작시키기 위해 view의 상속클래스를 generics에 ListCreateAPIview로 바꾸었다.
비슷한 ListAPIview도 있다.
(전자는 get,post메소드를, 후자는 get메소드만 제공한다)
이 ListAPIview는 get요청을 받을시 페이지네이션을 동작해서 쿼리셋으로 리스폰스를 보낸다.
get을 포함하고 있어서 get메소드 선언은 생략해주었다.
페이지네이션 복습 포인트.
- 하나의 뷰로 글 조회와 작성을 다 처리해야 할것이다. (뷰의 분리를 최소화)
그럴 경우 ListAPIview와 ListCreateAPIview중 어떤게 적절한지,
generics를 사용하는 것도 적절한지 확실히 알고싶다.
아티클view를 작성한 노하우를 쓴다면 다른 뷰도 통합 가능할것이다.
- ListAPIview 모듈의 작성법처럼 클래스 다중상속을 사용한다면,
더 적절한 작성법을 찾을수도 있겠다.