Class-based Views
减少代码重复
提高代码重用
【1】用Class-based Views重写API
from myLesson.models import MyLesson from myLesson.serializers import MyLessonSerializer from django.http import Http404 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class MyLessonList(APIView): """ List all myLesson, or create a new myLesson. """ def get(self,request,format=None): myLesson = MyLesson.objects.all() serializer = MyLessonSerializer(myLesson,many=True) return Response(serializer.data) def post(self,reuqest,format=None): serializer = Myserializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data,status=status.HTTP_201_CREATED) return Response(serializer.errors,stauts=status.HTTP_400_BAD_REQUEST) class MyLessonDetail(APIView): """ Retrieve,update or delete a myLesson instance. """ def get_object(self,pk): try: return MyLesson.objects.get(pk=pk) except MyLesson.DoesNotExist: raise Http404 def get(self,request,pk,format=None): myLesson = self.get_object(pk) serializer = MyLessonSerializer(myLesson) return Response(serializer.data) def put(self,request,pk,format=None): myLesson = self.get_object(pk) serializer = MyLessonSerializer(myLesson,data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST) def delete(self,request,pk,format=None): myLesson = self.get_object(pk) myLesson.delete() return Response(status.HTTP_204_NO_CONTENT) from django.conf.urls import url from myLesson import views from rest_framework.urlpatterns import format_suffix_patterns urlpatterns = [ url(r'^myLesson/$',views.MyLessonList.as_view()), url(r'^myLesson/(?P<pk>[0-9]+)/$',views.MyLessonDetail.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns)
【2】 mixins
minxin类实现了通用的http的各种方法
使用 GenericAPIView 创建了我们的视图,并且加入了 ListModelMixin 和 CreateModelMixin 。
基本类提供了核心的功能,而混入(mixin)类提供了 .list() 和 .create() 行为。然后,我们显式地在 get 和 post 方法里面,放入对应的行动。
from myLesson.models import MyLesson from myLesson.serializers import MyLessonSerializer from rest_framework import mixins from rest_framework import generics class MyLessonList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = MyLesson.objects.all() serializer_class = MyLessonSerializer def get(self,request,*args,**kwargs): return self.list(request,*args,**kwargs) def post(self,request,*args,**kwargs): return self.create(request,*args,**kwargs) class MyLessonDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = MyLesson.objects.all() serializer_class = MyLessonSerializer def get(self,request,*args,**kwargs): return self.retrieve(request,*args,**kwargs) def put(self,request,*args,**kwargs): return self.update(request,*args,**kwargs) def delete(self,request,*args,**kwargs): return self.destroy(request,*args,**kwargs)
使用基于泛类(generic class)的视图:
REST framework提供了一套已经实现了混入类的通用视图
from myLesson.models import MyLesson from myLesson.serializers import MyLessonSerializer from rest_framework import generics class MyLessonList(generics.ListCreateAPIView): queryset = MyLesson.objects.all() serializer_class = MyLessonSerializer class MyLessonDetail(generics.RetrieveUpdateDestroyAPIView): queryset = MyLesson.objects.all() serializer_class = MyLessonSerializer