[TIL_Carrotww] 52 - 22/11/15

μœ ν˜•μ„Β·2022λ…„ 11μ›” 15일
0

TIL

λͺ©λ‘ 보기
62/138
post-thumbnail

πŸ“Carrotww의 μ½”λ”© 기둝μž₯

🧲 django rest framework pagination

πŸ” pagination μžμ²΄λŠ” 쉽닀.
λ‚˜λŠ” get μš”μ²­μ— λ‚΄μš©μ— 따라 νŽ˜μ΄μ§€μ—μ„œ 인기순 μ •λ ¬, μ΅œμ‹ μˆœ 정렬을 ν•˜λ €κ³  ν–ˆμ–΄μ„œ λ‚œν•­μ„ κ²ͺμ—ˆμ§€λ§Œ ν•΄κ²°ν–ˆλ‹€.
일단 기본적은 pagination λΆ€ν„° μ •λ¦¬ν•˜λ €κ³  ν•œλ‹€.

🧲 pagination with settings.py

πŸ” 일단 rest framework org ν•΄λ‹Ή μ‚¬μ΄νŠΈλ₯Ό μ •λ…ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€. 막 λ”°λΌμ“°λŠ”κ±΄ μ‰¬μšΈ 수 μžˆμ–΄λ„ 처음 μ‚¬μš©ν• λ•ŒλŠ” μ–΄λ €μšΈ 수 μžˆλ‹€. 10λΆ„λ§Œ λŒ€μΆ© 읽어도 감이 μ˜¨λ‹€.

πŸ” settings.py

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

pagination을 μ „μ—­μœΌλ‘œ μ„€μ •ν•˜λŠ” 방법이닀.
μ›ν•˜λŠ” pagination을 써쀀 ν›„ (3가지) viewμ—μ„œ 쑰금만 κ±΄λ“œλ €μ£Όλ©΄ λœλ‹€.
ν…ŒμŠ€νŠΈ ν•΄λ³΄κΈ°λŠ” μ’‹μ§€λ§Œ μ‹€μ œ ν”„λ‘œμ νŠΈμ— 적용 μ˜ˆμ •μ΄λΌλ©΄ λ‹€λ₯Έ 방법을 μΆ”μ²œ

πŸ” views.py

from rest_framework.pagination import PageNumberPagination
from rest_framework.generics import ListAPIView

@permission_classes((permissions.AllowAny,))
class ArticleView(ListAPIView):
    pagination_class = PageNumberPagination
    serializer_class = ArticleSerializer
    queryset = ArticleModel.objects.all()

μœ„μ™€ 같이 μ„€μ • ν›„ ν•΄λ‹Ή view에 url을 λ“±λ‘ν•˜λ©΄ μ„€μ • 끝이닀.

κ°€μž₯ μ‰¬μš΄ 방법 끝

🧲 paginations.py μ„€μ •ν•˜κΈ°

πŸ” settings.pyμ—μ„œλ§Œ μ„€μ •ν•΄μ€€λ‹€λ©΄ μ „μ—­ μ„€μ •μœΌλ‘œ λ“€μ–΄κ°€ λͺ¨λ‘ pagination 될 수 μžˆλ‹€. ν•˜μ§€λ§Œ μœ„ νŒŒμΌμ„ 앱에 생성해주고 μ„ΈλΆ€ 섀정을 λ§Œμ Έμ€€λ‹€λ©΄ 관리가 μš©μ΄ν•˜λ‹€.

pagination.pyλ₯Ό 생성 ν›„

from rest_framework.pagination import CursorPagination
from rest_framework.pagination import PageNumberPagination

class PostPageNumberPagination(PageNumberPagination):
    page_size = 4

class PostPageNumberPagination2(CursorPagination):
    page_size = 4
    ordering = 'created_at'
    # cursor_query_param = 'page'
    # max_page_size = 50
    # page_query_param = 'p'

μœ„ λ°©λ²•μ—μ„œ settings.py 섀정은 ν•„μš” μ—†μœΌλ‹ˆ μ§€μ›Œμ€€λ‹€.

🧲 pagination customizing

πŸ” μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄ get methodλ₯Ό λ‚΄ λ§ˆμŒλŒ€λ‘œ μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€.
viewμ—μ„œ 쑰금 λ°”κΎΈμ–΄ μ£Όλ©΄ λœλ‹€.

from articles.paginations import PostPageNumberPagination, PostPageNumberPagination2
from rest_framework.generics import ListAPIView

@permission_classes((permissions.AllowAny,))
class ArticleView(ListAPIView):
    pagination_class = PostPageNumberPagination
    # paginations.py의 λ‚˜μ˜ pagination
    serializer_class = ArticleSerializer
    queryset = ArticleModel.objects.all()

    def get(self, request):
        print(self.request.GET.get('temp'))
        # get url μš”μ²­ ν…ŒμŠ€νŠΈ
        self.pagination_class = PostPageNumberPagination2
        # get μš”μ²­μ— 따라 if문을 κ±Έμ–΄μ„œ μ–΄λ–€ μ‹μœΌλ‘œ μ •λ ¬ν•  건지 선택 κ°€λŠ₯ν•˜λ‹€.
        # number pagination 같은 κ²½μš°λŠ” orderby둜 μ•„λž˜ μΏΌλ¦¬μ…‹μ—μ„œ κ°€λŠ₯ν•˜κ² μ§€λ§Œ
        # cursor pagination은 λΆˆκ°€λŠ₯ν–ˆλ‹€.
        pages = self.paginate_queryset(self.get_queryset())

        serializer = self.get_serializer(pages, many=True)

        return self.get_paginated_response(serializer.data)

일단 방법을 μ°Ύμ•„μ„œ λ°”λ‘œ 적어뒀닀.
get url μš”μ²­μ— λ”°λ₯Έ μ •λ ¬ 방식은 if λ¬Έ κ±Έκ³  cursor 즉 paginations.py cursorpagination μͺ½ μ˜΅μ…˜μ„ λ‹€λ₯΄κ²Œ μ£Όλ©΄ 될 것이닀.

이거 ν…ŒμŠ€νŠΈ ν•˜λŠλΌ 였늘 μ•Œκ³ λ¦¬μ¦˜μ„ λͺ»ν–ˆλ„€...

참고링크
https://velog.io/@woodstock1993/Django-GET-API-%EB%B6%84%EC%84%9D-ListAPIView
참고링크 2
https://drf-yasg.readthedocs.io/en/stable/custom_spec.html?highlight=PaginatorInspector

profile
Carrot_hyeong

0개의 λŒ“κΈ€