Django rest framework 페이지 별 예제 구현
기본 사용
(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__"
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.