Django에서 게시판을 만드는 방법은 크게 아래 두가지 방향으로 구현이 가능하다.
- Django의 Paginator (django.core.paginator import Paginator)
- DRF(Django Rest Framework)의 Pagination(rest_frameowork.pagination)
두 방식은 각기 장단점이 있으며, 서비스(기능) 중심으로 더 결이 잘 맞는 적절한 방향을 정하는 것이 좋다.
추가적으로 DRF 에는 세부적으로 3가지 방법이 제공되는데
- PageNumberPagination : 페이지 크기(PAGE_SIZE)를 정하고, 페이지 번호를 요청하는 조회 방법
- LimitOffsetPagination : 특정 지점(offset) 부터 특정 데이터 갯수(limit)을 정해서 가져오는 방법
- CursorPagination : 요청한 데이터 기준 이전, 이후 요청시 사용
해당 글은 DRF의 CursorPagination 방식을 이용해 Pagination을 구현하는 방법을 설명한다.
1. Project, App 생성
django-admin startproject pagination4
django-admin startapp posts
2. settings.py
INSTALLED_APPS = [
....,
'posts',
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS' : 'rest_framework.pagination.CursorPagination',
'PAGE_SIZE' : 2,
}
3. models.py
from django.db import models
# Create your models here.
class Post(models.Model):
class Meta:
db_table = "article"
title = models.CharField(max_length=256)
content = models.CharField(max_length=256)
4-1. pagination4 / urls.py
# pagination2/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('posts/', include('posts.urls')),
]
4-2. posts / urls.py
# posts/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('page/', views.PostPagination4ViewSet.as_view({'get': 'list'})),
]
5. serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
6. views.py
from rest_framework import viewsets
from rest_framework.pagination import CursorPagination # Cursor 기반 (next, prev 버튼) Pagination
from .models import Post
from .serializers import PostSerializer
class Pagination4(CursorPagination): # settings.py의 CursorPagination 상속
page_size = 3 # Default 2 => 3으로
ordering = 'title' # 정렬 기준도 가능
# url : posts/page?limit=4&offset=2
class PostPagination4ViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
pagination_class = Pagination4 #
7. admins.py
from django.contrib import admin
from posts.models import Post
admin.site.register(Post)
8. 명령어 실행
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver
9. Post 데이터 생성
admin 페이지에 접속하여 post 데이터 생성 (7개 이상 생성 권장)
API Test (Postman)
API Request
http://127.0.0.1:8000/posts/page/?cursor
http://127.0.0.1:8000/posts/page/?cursor=cD1mZmY%3D
JSON Response
{
"next": "http://127.0.0.1:8000/posts/page/?cursor=cD1qamo%3D",
"previous": "http://127.0.0.1:8000/posts/page/?cursor=cj0xJnA9Z2dn",
"results": [
{
"id": 5,
"title": "ggg",
"content": "ggg"
},
{
"id": 6,
"title": "hhh",
"content": "hhh"
},
{
"id": 8,
"title": "jjj",
"content": "jjj"
}
]
}
'Python > DRF' 카테고리의 다른 글
[DRF] Serializer 특징, 모듈(메소드, 인자) 비교 (0) | 2023.02.11 |
---|---|
[DRF] 간단한 캐싱 기능 구현 하기 (by. redis, DRF) (0) | 2022.11.19 |
[DRF] DRF Pagination (by. LimitOffsetPagination) (0) | 2022.11.10 |
[DRF] DRF Pagination (by. PageNumberPagination) (0) | 2022.11.10 |