Django REST framework基础:版本控制

DRF的版本控制

为何须要版本控制

API 版本控制容许咱们在不一样的客户端之间更改行为(同一个接口的不一样版本会返回不一样的数据)。 DRF提供了许多不一样的版本控制方案。后端

可能会有一些客户端由于某些缘由再也不维护了,可是咱们后端的接口还要不断的更新迭代,这个时候经过版本控制返回不一样的内容就是一种不错的解决方案。post

DRF提供的版本控制方案

DRF提供了五种版本控制方案,以下图:url

版本控制系统的使用

全局配置

这里咱们以 URLPathVersioning 为例,仍是在项目的settings.py中REST_FRAMEWORK配置项下配置:spa

REST_FRAMEWORK = {
    ...
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    'DEFAULT_VERSION': 'v1',  # 默认的版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效的版本
    'VERSION_PARAM': 'version',  # 版本的参数名与URL conf中一致
}

urls.py中版本控制

urlpatterns = [
    ...
    url(r'^(?P<version>[v1|v2]+)/publishers/$', views.PublisherViewSet.as_view({'get': 'list', 'post': 'create'})),
    url(r'^(?P<version>[v1|v2]+)/publishers/(?P<pk>\d+)/$', views.PublisherViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

]

咱们在视图中能够经过访问 request.version 来获取当前请求的具体版本,而后根据不一样的版原本返回不一样的内容:rest

咱们能够在视图中自定义具体的行为,下面以不一样的版本返回不一样的序列化类为例code

class PublisherViewSet(ModelViewSet):

    def get_serializer_class(self):
        """不一样的版本使用不一样的序列化类"""
        if self.request.version == 'v1':
            return PublisherModelSerializerVersion1
        else:
            return PublisherModelSerializer
    queryset = models.Publisher.objects.all()

局部配置

注意,一般咱们是不会单独给某个视图设置版本控制的,若是你确实须要给单独的视图设置版本控制,你能够在视图中设置versioning_class属性,以下:blog

class PublisherViewSet(ModelViewSet):

    ...
    versioning_class = URLPathVersioning
相关文章
相关标签/搜索