• django rest_framework入门四-类视图APIView


    上节,我们使用函数视图,用了@api_view装饰器来修饰,这一节,我们介绍类视图APIView,显然,类视图更符合面向对象的原则。

    1.使用类视图APIView重写API
    类视图APIView,取代@api_view装饰器,代码如下:

    from rest_framework import status
    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    
    
    class SnippetList(APIView):
        def get(self, request):
            snippets = Snippet.objects.all()
            serializer = SnippetSerializer(snippets, many=True)
            return Response(serializer.data)
    
        def post(self, request):
            data = request.data
            serializer = SnippetSerializer(data=data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
    class SnippetDetail(APIView):
        def get_object(self, pk):
            try:
                return Snippet.objects.get(pk=pk)
            except Exception as e:
                pass
    
        def get(self, request, pk):
            snippet = self.get_object(pk)
            serializer = SnippetSerializer(snippet)
            return Response(serializer.data)
    
        def put(self, request, pk):
            snippet = self.get_object(pk)
            serializer = SnippetSerializer(snippet, 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):
            snippet = self.get_object(pk)
            snippet.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    2.编辑urls.py

    from django.conf.urls import url, include
    from django.contrib import admin
    
    from snippets import views
    
    urlpatterns = [
        url(r'^snippets/$', views.SnippetList.as_view()),
        url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
        url(r'^admin/', admin.site.urls),
        url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
    ]
    

    APIView视图类,调用as_view()方法

    3.使用Mixins
    Mixins封装了增删改查的操作,因此可以使用Mixins简化代码,如下:

    from rest_framework import status
    from rest_framework.response import Response
    from rest_framework.views import APIView
    from rest_framework import mixins, generics
    
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    
    
    class SnippetList(mixins.ListModelMixin,
                      mixins.CreateModelMixin,
                      generics.GenericAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    
        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 SnippetDetail(mixins.RetrieveModelMixin,
                        mixins.UpdateModelMixin,
                        mixins.DestroyModelMixin,
                        generics.GenericAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    
        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)
    

    SnippetList继承了mixins的ListModelMixin和CreateModelMixin类,
    赋值queryset,serializer_class属性,
    然后定义了get,post方法,分别调用mixins的list,create函数。
    SnippetDetail定义类似。

    4.使用通用类视图generics
    rest_framework定义了可能的增删改查组合,优化了多重继承的繁杂

    from rest_framework import generics
    
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    
    
    class SnippetList(generics.ListCreateAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    
    
    class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    

    使用generics的ListCreateAPIView和RetrieveUpdateDestroyAPIView替代mixins类
    同时,去掉了get,post方法

    5.使用viewsets进一步简化
    viewsets包含了对一个model的增删改查全部操作,代码如下:

    from rest_framework import viewsets
    
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    
    
    class SnippetViewSet(viewsets.ModelViewSet):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    
  • 相关阅读:
    大话设计模式笔记 装饰模式
    大话设计模式笔记 依赖倒转原则
    大话设计模式笔记 单一职责原则 开放-封闭原则
    Effective Java 英文 第二版 读书笔记 Item 5:Avoid creating unnecessary objects.
    Effective Java 英文 第二版 读书笔记 Item 4:Attempting to enforce noninstantiability by making a class abstract does not work.
    Effective Java 英文 第二版 读书笔记 Item 3:Enforce the singleton property with a private constructor or an enum type.
    Effective Java 英文 第二版 读书笔记 Item 2:Consider a builder when faced with many constructor parameters.
    大话设计模式笔记 策略模式
    大话设计模式笔记 简单工厂模式
    jvm的垃圾回收算法
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/9089215.html
Copyright © 2020-2023  润新知