Restframework的版本及分页

1.版本

1.1基于url的get传参方式

1.创建django项目(起名我的是version),再创建一个app01应用

创建完成,通过python3 manage.py startapp api 命令创建一个api应用

注意:创建完后一定要在setting中进行配制:

这里必须强调这点,因为如果忘记,后期在api下models.py下创建的数据就无法迁移至数据路中

api/models.py(自行添加数据)

from django.db import models

class Userinfo(models.Model):
	user_type = (
		(1,'青铜'),
		(2,'黄金'),
		(3,'钻石'),
	)
	user_type = models.IntegerField(choices=user_type)
	username = models.CharField(max_length=32)
	password = models.CharField(max_length=64)

  version/urls.py

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
	url('api/', include('api.urls')),
]

  api/urls.py

from django.conf.urls import url
from api.views import UserView

urlpatterns = [
	url(r'users/', UserView.as_view()),
]

  api/views.py(QueryParameterVersioning用于去GET参数中取version)

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import QueryParameterVersioning

class UserView(APIView):
	# 实例化QueryParameterVersioning这个类
	versioning_class = QueryParameterVersioning

	def get(self,request,*args,**kwargs):
		print(request.version)
		return HttpResponse('ok')

  setting.py(注意这里的写法)

#版本
REST_FRAMEWORK = {
    "DEFAULT_VERSION":'v1',               #默认的版本
    "ALLOWED_VERSIONS":['v1','v2'],       #允许的版本
    "VERSION_PARAM":'version'             #GET方式url中参数的名字  ?version=xxx
}

  启动:

默认情况下版本v1

 指定其他版本则把报错

1.2 在全局setting配置版本信息------------>常用

修改api/urls.py----->这里利用了有名分组

from django.conf.urls import url
from api.views import UserView

urlpatterns = [
	url(r'(?P<version>w+)/users/', UserView.as_view()),
]

注释掉我们在views.py下之前的实例化

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView

class UserView(APIView):
	# 实例化QueryParameterVersioning这个类
	# versioning_class = QueryParameterVersioning

	def get(self,request,*args,**kwargs):
		print(request.version)
		return HttpResponse('ok')

 全局下的setting.py配置

REST_FRAMEWORK = {
    # 版本相关信息
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
    'VERSION_PARAM':'version',  # 这里的这个名字必须和我们的有名分组名称一致
    'DEFAULT_VERSION':'v1',
    'ALLOWED_VERSIONS':['v1','v2'],
}

  启动运行:

 不存在则报错

 

2.版本与分页

  创建django框架,创建我们的app(app01),我这里创建django默认创建了这个,再创建一个接口app(api),注意这里的每一个应用都是一个包,都应该包含__init__文件

  创建完后需要在setting中INSTALLED_APPS下手动添加我们的app('api.apps.ApiConfig','app01.apps.App01Config',),必须要有这两个app,记得检查下

  另外再添加一个渲染器 'rest_framework',用于最后渲染我们的页面

  api文件构造:

  在api的models下创建字段:(创建完后自己添加几条数据)

class Course(models.Model):
    """专题课/学位课模块表"""
    name = models.CharField(max_length=128, unique=True)

  api的urls.py下创建路由:

from django.conf.urls import url
from api.views import course


urlpatterns = [
    url(r'courses/$',course.CoursesView.as_view()),
    ]

 serializers下的course.py:

from rest_framework import serializers

# 对course字段序列化
class CourseSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()

  utils下的response.py

class BaseResponse(object):

    def __init__(self):
        self.code = 1000
        self.data = None
        self.error = None

    @property
    def dict(self):
        return self.__dict__

 views下的course.py

from api import models
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from api.utils.response import BaseResponse
from api.serializers.course import CourseSerializer

# 分页器
class CoursesView(APIView):
	def get(self, request, *args, **kwargs):
		# 一个返回状态信息的类
		ret = BaseResponse()
		try:
			queryset = models.Course.objects.all()
			# 分页
			page = PageNumberPagination()   # 实例化
			# 引用源码提供的方法,最终返回列表类型的数据
			course_list = page.paginate_queryset(queryset,request,self)
			# 分页后将结果序列化
			ser = CourseSerializer(instance=course_list,many=True)
			# 给我们的对象传值
			ret.data = ser.data
		except Exception as e:
			ret.code = 500
			ret.error = "获取数据失败"

		return Response(ret.dict)

  以上api中的构造基本完成,我们的总路由(与setting同级目录下)的urls.py:

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/(?P<version>w+)/',include('api.urls')),
]

  最终,我们事先版本以及分页效果,还要在setting下添加一下配置信息:

REST_FRAMEWORK = {
    # 版本相关信息
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
    'VERSION_PARAM':'version',
    'DEFAULT_VERSION':'v1',
    'ALLOWED_VERSIONS':['v1','v2'],
    # 分页相关信息,数字代表一页几条数据
    'PAGE_SIZE':2
}

  ok。效果如下:

  我们只添加了两个版本v1和v2,现在改成v3:

原文地址:https://www.cnblogs.com/LearningOnline/p/9426901.html