# 注意,搞出这么多方法,其实就是为了不写重复代码 # 第一种方案,自己定义类 # class List: # def list(self,request): # q_list=self.q_list # bs=self.serializer(q_list,many=True) # return JsonResponse(bs.data,safe=False) # class Create: # def create(self,request): # bs=self.serializer(data=request.data) # if bs.is_valid(): # bs.save()#生成记录 # return JsonResponse(bs.data,safe=False) # else: # return JsonResponse(bs.errors,safe=False) # # # class Publish(APIView,List,Create): # q_list=models.Publish.objects.all() # serializer=MySer.PublishSerializer # def get(self,request): # return self.list(request) # def post(self,request): # return self.create(request) # 第二种方案,drf提供的封装的类 from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \ DestroyModelMixin from rest_framework.generics import GenericAPIView # # class Publish(GenericAPIView, ListModelMixin, CreateModelMixin): # queryset = models.Publish.objects.all() # serializer_class = MySer.PublishSerializer # #上面两个参数是一定要配上的 # def get(self, request): # return self.list(request) # # def post(self, request): # # 添加一条数据 # return self.create(request) # # # class PublishDetail(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin): # queryset = models.Publish.objects.all() # serializer_class = MySer.PublishSerializer # def get(self, request, pk): # return self.retrieve(request, pk) # def put(self, request, pk): # return self.update(request, pk) # def delete(self, request, pk): # return self.destroy(request, pk) #第三种方法: from rest_framework.generics import ListCreateAPIView #ListCreateAPIView继承了mixins.ListModelMixin,mixins.CreateModelMixin,GenericAPIView, #而且自己内部重写了get,和post方法,和上面自己写的一样,所以直接继承这个类,就不用再get和post的代码了 # class Publish(ListCreateAPIView): # queryset = models.Publish.objects.all() # serializer_class = MySer.PublishSerializer from rest_framework.generics import RetrieveUpdateDestroyAPIView #RetrieveUpdateDestroyAPIView继承了mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,GenericAPIView #并且重写了get,put,patch,delete方法,这些方法就不用自己写了 # class PublishDetail(RetrieveUpdateDestroyAPIView): # queryset = models.Publish.objects.all() # serializer_class = MySer.PublishSerializer #第四种方法:(不建议用),使用这种方法,需要在路由进行配置 from rest_framework.viewsets import ModelViewSet class Publish(ModelViewSet): queryset = models.Publish.objects.all() serializer_class = MySer.PublishSerializer #建议使用魔法类ViewSetMixin from rest_framework.viewsets import ViewSetMixin #注意继承的先后顺序,ViewSetMixin要写在前面 class TestAll(ViewSetMixin,APIView): def test(self,request): return HttpResponse('test') def test2(self,request2): return HttpResponse('test2') def test3(self,request3): return HttpResponse('test3')
路由代码
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/', views.Books.as_view()), url(r'^login/', views.Login.as_view()), url(r'^authors/', views.Authors.as_view()), url(r'^test/', views.TestAll.as_view({'get': 'test3'})), # url(r'^publish/$', views.Publish.as_view()), # url(r'^publish/(?P<pk>\d+)', views.PublishDetail.as_view()), # url(r'^publish/(?P<pk>\d+)', views.PublishDetailView.as_view()), url(r'^publish/$',views.Publish.as_view({'get':'list','post':'create'})), url(r'^publish/(?P<pk>\d+)',views.Publish.as_view({'get':'retrieve','put':'update','delete':'destroy'})) ]