zoukankan      html  css  js  c++  java
  • Django REST framework -- Class-based Views

    Class-based Views

    https://www.django-rest-framework.org/tutorial/3-class-based-views/

    APIView 继承于 django view类
    提供了 http method 方法的抽象, 即继承于此类的应用类中, 可以定义 get post 等方法, 来处理对应的http方法请求。

    获取全部实例 和 创建实例。
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    from django.http import Http404
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    
    
    class SnippetList(APIView):
        """
        List all snippets, or create a new snippet.
        """
        def get(self, request, format=None):
            snippets = Snippet.objects.all()
            serializer = SnippetSerializer(snippets, many=True)
            return Response(serializer.data)
    
        def post(self, request, format=None):
            serializer = SnippetSerializer(data=request.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):
        """
        Retrieve, update or delete a snippet instance.
        """
        def get_object(self, pk):
            try:
                return Snippet.objects.get(pk=pk)
            except Snippet.DoesNotExist:
                raise Http404
    
        def get(self, request, pk, format=None):
            snippet = self.get_object(pk)
            serializer = SnippetSerializer(snippet)
            return Response(serializer.data)
    
        def put(self, request, pk, format=None):
            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, format=None):
            snippet = self.get_object(pk)
            snippet.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)

    将定义的业务类, 调用其 as_view 转换为 普通的django view处理函数(接受一个参数 request实例, 函数中返回 reponse实例)

    from django.urls import path
    from rest_framework.urlpatterns import format_suffix_patterns
    from snippets import views
    
    urlpatterns = [
        path('snippets/', views.SnippetList.as_view()),
        path('snippets/<int:pk>/', views.SnippetDetail.as_view()),
    ]
    
    urlpatterns = format_suffix_patterns(urlpatterns)

    Using mixins

    对于更加普适的模型处理逻辑, 应该有更加普适的view模式类来处理, 不用业务编写者来实现 get post函数的业务逻辑。

    restframework提供了 GenericAPIView , 此类继承于 APIView

    封装了 get post等通用的模型处理方法,

    继承此类的业务类,指定queryset 和 serializer类, 然后在 get post方法中调用  MIXIN 类封装好的业务逻辑函数。

    获取全部实例 和 创建单个实例。

    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    from rest_framework import mixins
    from rest_framework import generics
    
    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)

    Using generic class-based views

    如果get post函数中没有定制化的逻辑, 则使用 具体的业务APIView 则更加合适。

    这样 get post函数的定义也可以省略了。

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

    GenericAPIView

    https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview

    This class extends REST framework's APIView class, adding commonly required behavior for standard list and detail views.

    Each of the concrete generic views provided is built by combining GenericAPIView, with one or more mixin classes.

    Mixins

    https://www.django-rest-framework.org/api-guide/generic-views/#mixins

    The mixin classes provide the actions that are used to provide the basic view behavior. Note that the mixin classes provide action methods rather than defining the handler methods, such as .get() and .post(), directly. This allows for more flexible composition of behavior.

    The mixin classes can be imported from rest_framework.mixins

    Concrete View Classes

    https://www.django-rest-framework.org/api-guide/generic-views/#concrete-view-classes

    The following classes are the concrete generic views. If you're using generic views this is normally the level you'll be working at unless you need heavily customized behavior.

    The view classes can be imported from rest_framework.generics.

    http://blogs.thebitx.com/index.php/2021/09/29/django-rest-framework-views-generic-views/

    继承图

    http://blogs.thebitx.com/index.php/2021/09/29/django-rest-framework-views-generic-views/

    https://www.cnblogs.com/shijieli/p/10273610.html

    出处:http://www.cnblogs.com/lightsong/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    kibana We couldn't activate monitoring
    学Redis这篇就够了!
    elasticsearch 官方监控文档 老版但很有用
    java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏
    Apache Beam实战指南 | 大数据管道(pipeline)设计及实践
    InnoDB一棵B+树可以存放多少行数据?
    函数编程真不好
    面向对象编程灾难
    可能是全网最好的MySQL重要知识点 | 面试必备
    终于有人把elasticsearch原理讲通了
  • 原文地址:https://www.cnblogs.com/lightsong/p/15399913.html
Copyright © 2011-2022 走看看