django rest frame work 初步使用 >> APIView + Maxin + 通用混合
Part 1. API View:
from helloworld.models import Publisher from helloworld.serializers import PublisherSerializer from rest_framework.response import Response from rest_framework import status from rest_framework.views import APIView from django.http import Http404 class PublisherList(APIView): """ list all or POST: create """ def get(self, request): queryset = Publisher.objects.all() s = PublisherSerializer(queryset, many=True) return Response(s.data) def post(self, request): s = PublisherSerializer(data=request.data) if s.is_valid(): s.save() return Response(s.data, status=status.HTTP_201_CREATED) return Response(s.errors, status=status.HTTP_400_BAD_REQUEST) class PublisherDetail(APIView): """ GET: PUT: update DELETE: """ def get_object(self, pk): try: return Publisher.objects.get(id=pk) except Publisher.DoesNotExist: return Http404 def get(self, request, pk): p = self.get_object(pk) s = PublisherSerializer(p) return Response(s.data) def put(self, request, pk): p = self.get_object(pk) s = PublisherSerializer(p, data=request.data) if s.is_valid(): s.save() return Response(s.data) return Response(s.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk): p = self.get_object(pk) p.delete() return Response(status=status.HTTP_204_NO_CONTENT)
urlpatterns = [ path('p/', views.PublisherList.as_view()), path('p/<int:pk>/', views.PublisherDetail.as_view()) ]
Part 2. 混合视图
from rest_framework import mixins from rest_framework import generics from helloworld.models import Publisher from helloworld.serializers import PublisherSerializer class PublisherList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Publisher.objects.all() serializer_class = PublisherSerializer 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 PublisherDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Publisher.objects.all() serializer_class = PublisherSerializer 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)
Part 3. 通用超级混合视图
from helloworld.models import Publisher from helloworld.serializers import PublisherSerializer from rest_framework import mixins from rest_framework import generics class PublisherList(generics.ListCreateAPIView): queryset = Publisher.objects.all() serializer_class = PublisherSerializer class PublisherDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Publisher.objects.all() serializer_class = PublisherSerializer