Django

장고 커서 페이지네이션

zhelddustmq 2024. 10. 2. 09:30

 

DRF의 내장 페이지네이션 클래스 구성하기

DRF에는 PageNumberPagination, LimitOffsetPagination, CursorPagination 등이 있음.

  • PageNumberPagination: 데이터를 일정 크기의 페이지로 나누고 클라이언트가 특정 페이지를 요청할 수 있게 함.
  • LimitOffsetPagination: 클라이언트가 반환할 항목 수와 데이터 컬렉션 내에서 시작 지점을 지정할 수 있음.
  • CursorPagination: 큰 데이터 세트에 대해 더 효율적인 커서 기반의 페이지네이션 시스템을 제공

이러한 페이지네이션 클래스를 사용하려면 DRF 설정의 DEFAULT_PAGINATION_CLASS에 추가하고 페이지 크기를 지정해야 함.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    # 기타 DRF 설정...
}

 

이후, 사용자앱/views.py 안에 페이지네이션 기능을 쓰고 싶은 클래스(ViewSet이나 ListView클래스여야함)에 아래 코드처럼 추가하면 됨.

from rest_framework.pagination import PageNumberPagination
class BookViewSet(viewsets.ModelViewSet):
    ...
    pagination_class = PageNumberPagination
    ...

 

 

 

 

정렬되게끔 페이지 데이터를 가져오고 싶다면 커스터마이징 해야함

from rest_framework import filters

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['name', 'description']
    ordering_fields = ['name', 'created_at']

이 예시에서는 SearchFilter와 OrderingFilter라는 두 가지 내장된 필터 백엔드를 활성화. 

- SearchFilter는 지정된 필드(name과 description)를 기준으로 검색을 수행.

- OrderingFilter는 지정된 필드(name과 created_at)를 기준으로 정렬을 수행.

 

예시 완성코드

from rest_framework import viewsets
from rest_framework.filters import SearchFilter, OrderingFilter
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    pagination_class = PageNumberPagination
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['title', 'author']
    ordering_fields = ['publication_date', 'price']

    def get_queryset(self):
        queryset = super().get_queryset()

        # 요청에서 필터링 매개변수 가져오기
        title = self.request.query_params.get('title', None)
        author = self.request.query_params.get('author', None)

        # 필터링 적용
        if title:
            queryset = queryset.filter(title__icontains=title)
        if author:
            queryset = queryset.filter(author__icontains=author)

        # 정렬 적용
        ordering = self.request.query_params.get('ordering', None)
        if ordering in self.ordering_fields:
            queryset = queryset.order_by(ordering)

        return queryset

'Django' 카테고리의 다른 글

장고 서버 배포 간단 요약  (0) 2024.10.04
django admin 커스터마이징 시 유의점  (0) 2024.10.01
Django MTM field 단점  (0) 2024.09.23
Django permissoin_classes (GET, POST 나누기)  (0) 2024.09.05
Django 서버 배포하기  (4) 2024.09.03