TIL. drf팀프로젝트(4) pagination

2023년 05월 12일 by barryjung

    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 모듈의 작성법처럼 클래스 다중상속을 사용한다면,

더 적절한 작성법을 찾을수도 있겠다.