Django rest framework 페이지 별 예제 구현

첫 번 째 페이지 페이지 PageNumberPagination
기본 사용
(1)urls.py

urlpatterns = [
  re_path('(?P<version>[v1|v2]+)/page1/', Pager1View.as_view(),)  #  1
]
(2)api/utils/serializers/pager.py

# api/utils/serializsers/pager.py
from rest_framework import serializers
from api import models

class PagerSerialiser(serializers.ModelSerializer):
  class Meta:
    model = models.Role
    fields = "__all__"
(3)views.py

from api.utils.serializsers.pager import PagerSerialiser
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination

class Pager1View(APIView):
  def get(self,request,*args,**kwargs):
    #      
    roles = models.Role.objects.all()
    #      
    pg = PageNumberPagination()
    #       
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #        
    ser = PagerSerialiser(instance=page_roles,many=True)
    return Response(ser.data)
(4)settings 설정

REST_FRAMEWORK = {
  #  
  "PAGE_SIZE":2  #       
}

사용자 정의 페이지 클래스

#      
class MyPageNumberPagination(PageNumberPagination):
  #       
  page_size = 3
  #      3 ,      pager1/?page=2&size=4,           
  page_size_query_param = "size"
  #       10
  max_page_size = 10
  #      
  page_query_param = "page"


class Pager1View(APIView):
  def get(self,request,*args,**kwargs):
    #      
    roles = models.Role.objects.all()
    #      ,       MyPageNumberPagination
    pg = MyPageNumberPagination()
    #       
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #        
    ser = PagerSerialiser(instance=page_roles,many=True)
    return Response(ser.data)

두 번 째 페이지 제한 오프셋 페 이 징
사용자 정의

#      2
class MyLimitOffsetPagination(LimitOffsetPagination):
  #       
  default_limit = 2
  #     
  offset_query_param = "offset"
  #  limit         
  limit_query_param = "limit"
  #         
  max_limit = 10


class Pager1View(APIView):
  def get(self,request,*args,**kwargs):
    #      
    roles = models.Role.objects.all()
    #      
    pg = MyLimitOffsetPagination()
    #       
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #        
    ser = PagerSerialiser(instance=page_roles,many=True)
    return Response(ser.data)


돌아 올 때 getpaginated_response 방법
아래 페이지


세 번 째 페이지 CursorPagination
페이지 를 암호 화 하 는 방식 은'이전 페이지'와 다음 페이지 를 통 해 만 데 이 터 를 방문 할 수 있 습 니 다.

#      3 (    )
class MyCursorPagination(CursorPagination):
  cursor_query_param = "cursor"
  page_size = 2   #    2   
  ordering = 'id'  #  
  page_size_query_param = None
  max_page_size = None

class Pager1View(APIView):
  def get(self,request,*args,**kwargs):
    #      
    roles = models.Role.objects.all()
    #      
    pg = MyCursorPagination()
    #       
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #        
    ser = PagerSerialiser(instance=page_roles,many=True)
    # return Response(ser.data)
    return pg.get_paginated_response(ser.data)


코드
버 전,해석 기,직렬 화,페이지 나 누 기

# MyProject2/urls.py

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
  #path('admin/', admin.site.urls),
  path('api/',include('api.urls') ),
]

# api/urls.py

from django.urls import path,re_path
from .views import UserView,PaserView,RolesView,UserInfoView,GroupView,UserGroupView
from .views import Pager1View

urlpatterns = [
  re_path('(?P<version>[v1|v2]+)/users/', UserView.as_view(),name = 'api_user'), #  
  path('paser/', PaserView.as_view(),),  #  
  re_path('(?P<version>[v1|v2]+)/roles/', RolesView.as_view()),   #   
  re_path('(?P<version>[v1|v2]+)/info/', UserInfoView.as_view()),  #   
  re_path('(?P<version>[v1|v2]+)/group/(?P<pk>\d+)/', GroupView.as_view(),name = 'gp'),  #     url
  re_path('(?P<version>[v1|v2]+)/usergroup/', UserGroupView.as_view(),),  #      
  re_path('(?P<version>[v1|v2]+)/pager1/', Pager1View.as_view(),)  #  1
]

# api/models.py

from django.db import models

class UserInfo(models.Model):
  USER_TYPE = (
    (1,'    '),
    (2,'VIP'),
    (3,'SVIP')
  )

  user_type = models.IntegerField(choices=USER_TYPE)
  username = models.CharField(max_length=32,unique=True)
  password = models.CharField(max_length=64)
  group = models.ForeignKey('UserGroup',on_delete=models.CASCADE)
  roles = models.ManyToManyField('Role')


class UserToken(models.Model):
  user = models.OneToOneField('UserInfo',on_delete=models.CASCADE)
  token = models.CharField(max_length=64)


class UserGroup(models.Model):
  title = models.CharField(max_length=32)


class Role(models.Model):
  title = models.CharField(max_length=32)

# api/views.py
import json

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.versioning import URLPathVersioning
from . import models

##########################################      #####################################################

class UserView(APIView):

  def get(self,request,*args,**kwargs):
    #    
    print(request.version)
    #         
    print(request.versioning_scheme)
    #        url,reverse    
    #      :viewname  url    ,request=request url       
    #(?P<version>[v1|v2]+)/users/,       version   ,  version   request  ,     request=request   
    url_path = request.versioning_scheme.reverse(viewname='api_user',request=request)
    print(url_path)
    self.dispatch
    return HttpResponse('    ')

# from rest_framework.parsers import JSONParser,FormParser

class PaserView(APIView):
  '''  '''
  # parser_classes = [JSONParser,FormParser,]
  #JSONParser:      content-type:application/json  
  #FormParser:      content-type:application/x-www-form-urlencoded  

  def post(self,request,*args,**kwargs):
    #        
    print(request.data)
    return HttpResponse('paser')


###########################################   ###########################################################

from rest_framework import serializers

#          
class RolesSerializer(serializers.Serializer):
  #Role      id title   
  id = serializers.IntegerField()
  title = serializers.CharField()

class RolesView(APIView):
  def get(self,request,*args,**kwargs):
    #    :  [obj,obj,obj]
    # (Queryset)
    # roles = models.Role.objects.all()
    #    ,    ,instance:Queryset       ,     mangy=True
    # ser = RolesSerializer(instance=roles,many=True)
    #   json  ,ensure_ascii=False      ,   True
    # ret = json.dumps(ser.data,ensure_ascii=False)

    #    :
    role = models.Role.objects.all().first()
    ser = RolesSerializer(instance=role, many=False)
    ret = json.dumps(ser.data, ensure_ascii=False)
    return HttpResponse(ret)


# class UserInfoSerializer(serializers.Serializer):
#   '''        '''
#   #user_type choices(1,2,3),        source
#   type = serializers.CharField(source="get_user_type_display")
#   username = serializers.CharField()
#   password = serializers.CharField()
#   #group.title:    
#   group = serializers.CharField(source="group.title")
#   #SerializerMethodField(),       
#   #           
#   rls = serializers.SerializerMethodField()
#
#   def get_rls(self,row):
#     #         
#     role_obj_list = row.roles.all()
#     ret = []
#     #     id   
#     #           
#     for item in role_obj_list:
#       ret.append({"id":item.id,"title":item.title})
#     return ret


# class UserInfoSerializer(serializers.ModelSerializer):
#   type = serializers.CharField(source="get_user_type_display")
#   group = serializers.CharField(source="group.title")
#   rls = serializers.SerializerMethodField()
#
#   def get_rls(self, row):
#     #          
#     role_obj_list = row.roles.all()
#     ret = []
#     #      id   
#     #            
#     for item in role_obj_list:
#       ret.append({"id": item.id, "title": item.title})
#     return ret
#
#   class Meta:
#     model = models.UserInfo
#     fields = ['id','username','password','type','group','rls']

# class UserInfoSerializer(serializers.ModelSerializer):
#   class Meta:
#     model = models.UserInfo
#     #fields = "__all__"
#     fields = ['id','username','password','group','roles']
#     #       
#     depth = 1


class UserInfoSerializer(serializers.ModelSerializer):
  group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='pk')
  class Meta:
    model = models.UserInfo
    #fields = "__all__"
    fields = ['id','username','password','group','roles']
    #       
    depth = 0


class UserInfoView(APIView):
  '''     '''
  def get(self,request,*args,**kwargs):
    users = models.UserInfo.objects.all()
    #        context={'request':request}
    ser = UserInfoSerializer(instance=users,many=True,context={'request':request})
    ret = json.dumps(ser.data,ensure_ascii=False)
    return HttpResponse(ret)


class GroupSerializer(serializers.ModelSerializer):
  class Meta:
    model = models.UserGroup
    fields = "__all__"

class GroupView(APIView):
  def get(self,request,*args,**kwargs):
    pk = kwargs.get('pk')
    obj = models.UserGroup.objects.filter(pk=pk).first()

    ser = GroupSerializer(instance=obj,many=False)
    ret = json.dumps(ser.data,ensure_ascii=False)
    return HttpResponse(ret)



####################################              ####################################

#       
class GroupValidation(object):
  def __init__(self,base):
    self.base = base

  def __call__(self, value):
    if not value.startswith(self.base):
      message = "     %s   "%self.base
      raise serializers.ValidationError(message)


class UserGroupSerializer(serializers.Serializer):
  title = serializers.CharField(validators=[GroupValidation('    '),])

class UserGroupView(APIView):
  def post(self,request,*args, **kwargs):
    ser = UserGroupSerializer(data=request.data)
    if ser.is_valid():
      print(ser.validated_data['title'])
    else:
      print(ser.errors)

    return HttpResponse("        ")


##################################################  ###################################################

from api.utils.serializsers.pager import PagerSerialiser
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

# #      1
# class MyPageNumberPagination(PageNumberPagination):
#   #       
#   page_size = 3
#   #      3 ,      pager1/?page=2&size=4,           
#   page_size_query_param = "size"
#   #       10
#   max_page_size = 10
#   #      
#   page_query_param = "page"

#      2
class MyLimitOffsetPagination(LimitOffsetPagination):
  #       
  default_limit = 2
  #     
  offset_query_param = "offset"
  #  limit         
  limit_query_param = "limit"
  #         
  max_limit = 10


#      3 (    )
class MyCursorPagination(CursorPagination):
  cursor_query_param = "cursor"
  page_size = 2   #    2   
  ordering = 'id'  #  
  page_size_query_param = None
  max_page_size = None


class Pager1View(APIView):
  def get(self,request,*args,**kwargs):
    #      
    roles = models.Role.objects.all()
    #      
    pg = MyCursorPagination()
    #       
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #        
    ser = PagerSerialiser(instance=page_roles,many=True)
    return Response(ser.data)
    # return pg.get_paginated_response(ser.data)

# api/utils/serializsers/pager.py

from rest_framework import serializers
from api import models


class PagerSerialiser(serializers.ModelSerializer):
  class Meta:
    model = models.Role
    fields = "__all__"
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기