官方文档:http://www.django-rest-framework.org/
drf为咱们提供强大的通用view的功能,本博客对这些view进行简要的总结分析。
首先,咱们看一下主要的几种view以及他们之间的关系。python
这其中,还涉及了mixins,主要也分为5类: 下面咱们以课程(course)做为一个例子,对view进行一个总结。django
首先,咱们使用django自带的view,获取一个课程的列表:json
# drf是经过json的格式进行数据交互的,因此这里也返回json数据
import json
from django.views.generic.base import View
from django.core import serializers
from django.http import HttpResponse,JsonResponse
from .models import Course
class CourseListView(View):
def get(self, request):
""" 经过django的view实现课程列表页 """
courses = Course.objects.all()[:10]
json_data = serializers.serialize('json', Courses)
json_data = json.loads(json_data)
return JsonResponse(json_data, safe=False)
复制代码
接下来,咱们用APIView来实现bash
from rest_framework.views import APIView
from rest_framework.response import Response
# 这个serializers是在其余文件自定义的,这里对这个不进行过多介绍
from .serializers import CourseSerializer
class CourseListView(APIView):
def get(self, request, format=None):
""" 经过APIView实现课程列表页 """
courses = Course.objects.all()
serializer = CourseSerializer(courses, many=True)
return Response(serializer.data)
复制代码
在APIView这个例子中,调用了drf自己的serializer以及Response方法。
APIView对django自己的View进行封装,从上述的代码,这样分析,二者的差异看起来不是很大,但实际中APIView作了不少东西,它定义了不少属性与方法,举几个例子session
# 这三个是经常使用的属性
authentication_classes : 用户登陆认证方式,session或者token等等
permission_classes : 权限设置,是否须要登陆等
throttle_classes : 限速设置,对用户进行必定的访问次数限制等等。
复制代码
到这里,可能还不能体现drf经过view的强大之处,那么接下来的GenericAPIView就展现了它强大的功能。post
from rest_framework import mixins
from rest_framework import generics
class CourseListView(mixins.ListModelMixin, generics.GenericAPIView):
""" 课程列表页 """
queryset = Course.objects.all()
serialize_class = CourseSerializer
def get(self, request, *args, **kwargs):
# list方法是存在于mixins中的,同理,create等等也是
# GenericAPIView没有这些方法!
return self.list(request, *args, **kwargs)
复制代码
在这个例子中,继承了mixins中的ListModelMixin,在get( )方法中,调用了它的list()方法,list方法会返回queryset的json数据。这里对mixins不进行过多的介绍。 GenericAPIView对APIView再次封装,实现了强大功能:ui
class CourseListView(ListAPIView):
""" 课程列表页 """
queryset = Course.objects.all()
serialize_class = CourseSerializer
复制代码
这样,就完成了和刚刚如出一辙的功能!url
既然GenericAPIView以及它相关的View已经完成了许许多多的功能,那么还要ViewSet干吗!
首先,咱们思考一个问题,一样上面的例子,咱们在功能上,要获取课程的列表,也要获取某个课程的具体信息。那么怎么实现,按照GenericAPIView,咱们能够这样实现:spa
class CourseView(ListAPIView,RetrieveAPIView):
# 只须要在上面的基础上,再继承RetrieveAPIView就ok了。
queryset = Course.objects.all()
serialize_class = CourseSerializer
复制代码
但这样实现有一个问题,关于serialize_class,显然,当获取课程列表时,只须要传回去全部课程的简要信息,如课程名字,老师,封面等等,但当获取课程的具体信息,咱们还要将他们的章节以及相关下载资料(很明显,章节是另一个model,有一个外键指向course),这些信息会不少,在获取课程列表,将这些传回去显然是不理智的。那么,还须要再定义一个CourseDetailSerializer,在get /courses/的时候,使用CourseSerializer,在get /courses/id/的时候,使用CourseDetailSerializer。
那么,问题来了,咱们怎么获取到是哪一个action方法?这个时候,viewset就出场了!.net
from rest_framework import viewsets
import...
class CourseViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = Course.objects.all()
def get_serializer_class(self):
# 重写get_serializer_class方法
if self.action == 'list':
return CourseSerializer
return CourseDetailSerializer
复制代码
# 进行绑定
courses = CourseViewSet.as_view({
'get': 'list',
'post': 'create'
})
urlpatterns = [
...
# 常规加入url匹配项
url(r'courses/', CourseViewSet.as_view(), name='courses'),]
复制代码
这样,咱们就将http请求方法与mixins方法进行了关联。那么还有更简洁的方法吗?很明显,固然有,这个时候,route就登场了!
from rest_framework.routers import DefaultRouter
router = DefaultRouter() # 只须要实现一次
router.register(r'courses', CourseViewSet, base_name='courses')
urlpatterns = [
...
# 只须要加入一次
url(r'^', include(router.urls)),]
复制代码
route中使用的必定要是ViewSet,用router.register的方法注册url不只能够很好的管理url,不会致使url过多而混乱,并且还能实现http方法与mixins中的相关方法进行链接。
在viewset中,还提供了两个以及与mixins绑定好的ViewSet,固然,这两个ViewSet彻底能够本身实现:
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
# 知足只有GET方法请求的情景
pass
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
# 知足全部请求都有的情景
pass
复制代码
到这里,ViewSet的强大功能就介绍完了,强烈建议在作drf的时候,使用ViewSet与mixins方法结合进行开发,为我这种小白开发者提供了很强大完整的功能!
做者接下来还会对mixins等等进行总结,本人也为初学者,若是有不对的地方,麻烦各位指出探讨,感谢!
CSDN地址:http://blog.csdn.net/l_vip/article/details/79131289