参考链接:https://www.cnblogs.com/liwenzhou/p/10269268.html

1.路由:

   #版本控制
re_path('^(?P<version>[v1|v2]+)/books/$', views.BookView.as_view()), # View(request) ======APIView:dispatch()
re_path('^(?P<version>[v1|v2]+)/book/(?P<id>\d+)/$', views.BookDetaiView.as_view(),name='books'), # View(request)

2.setings页面配置全局

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

3.视图中应用:

# 版本控制
from app01.utils import *
class BookView(APIView):
def get(self, request, *args, **kwargs):
print(request.version) # 获取当前版本
book_list = models.Book.objects.all().order_by("id")
# 根据不同版本返回不同的序列化类
if request.version =='v1':
bs = BookModelSerializers(instance=book_list, many=True,
context={'request': request})           # 在做链接的时候需要添加context参数
return Response(bs.data)
else:
publish = models.Publisher.objects.all()
# data put serializers data packging
bs = PublishModelSerializers(publish, many=True) # many=True多个对象
return Response(bs.data)

局部配置(一般不用)

注意,通常我们是不会单独给某个视图设置版本控制的,如果你确实需要给单独的视图设置版本控制,你可以在视图中设置versioning_class属性,如下:

class PublisherViewSet(ModelViewSet):

    ...
versioning_class = URLPathVersioning
05-11 19:34