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 |