• Restframework中常见API的编写方式


    1.框架一(继承APIView)

      这里的第一部分使用骨架请参考我的博客(第三篇),它采用了restframework中最基础的办法(APIView)实现了相关请求,以下的框架都是基于它的

    2.框架二(继承ViewSetMixin)

      对于框架一,我们只继承APIView,也能实现增删改查的方法,但是不要忘了:

      对于查看(get),我们可以查看全部,也能查看局部(添加id)

      对于删除,我们也要根据指定id删除,对于修改,我们也要根据指定id修改

      那么,我们就要写两个路由,两个类:一个类(CoursesView)中包含了get和post方法,每个方法不用携带id;一个类(CourseDetailView)中包含了get,put和delete三个方法,都需要携带id

      这样我们操作的的类过多,每一个都要写两套类,那样工作量就会很大

      而框架二是在继承APIView的基础下,再继承ViewSetMixin的类,来实现一套路由的管理

    我们先来查看ViewSetMixin的文档说明:

        """
        This is the magic.
    
        Overrides `.as_view()` so that it takes an `actions` keyword that performs
        the binding of HTTP methods to actions on the Resource.
    
        For example, to create a concrete view binding the 'GET' and 'POST' methods
        to the 'list' and 'create' actions...
    
        view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
        """
    

     基于源码我们来重写views下的course.py

    from rest_framework.views import APIView
    from rest_framework.viewsets import ViewSetMixin
    
    class CoursesView(ViewSetMixin,APIView):
        # 查看
        def list(self, request, *args, **kwargs):
            pass
    
        # 增加
        def create(self, request, *args, **kwargs):
            pass
    
        # 局部查看
        def retrieve(self, request, pk, *args, **kwargs):
            pass
    
        # 指定id修改
        def update(self, request, pk, *args, **kwargs):
            pass
    
        # 指定id删除
        def destroy(self, request, pk, *args, **kwargs):
            pass
    

      api下的urls.py

    from django.conf.urls import url
    from api.views import course
    
    urlpatterns = [
        url(r'courses/$',course.CoursesView.as_view({'get':'list','post':'create'})),
        url(r'courses/(?P<pk>d+)/$',course.CoursesView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
    ]
    

      实际情况下,我们也不会这几种方法都用到,主要还是查看

    3.框架三(继承ViewSetMixin和generics.GenericAPIView)

    相关源码说明:

    基于源码我们来重写views下的course.py

    from api import models
    from rest_framework.response import Response
    from api.serializers.course import CourseSerializer
    from rest_framework.viewsets import GenericViewSet
    from rest_framework.mixins import ListModelMixin,CreateModelMixin,
        RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,ListModelMixin
    
    
    # 这里我只使用了list方法,你要是用其他哪一种方法,直接把它的相关类写进即可
    class CoursesView(ListModelMixin,GenericViewSet):
        queryset = models.Course.objects.all()
    
        def list(self, request, *args, **kwargs):
            course_list = models.Course.objects.all()
            ser = CourseSerializer(instance=course_list, many=True)
            return Response(ser.data) 

      api下的urls.py

    from django.conf.urls import url
    from api.views import course
    
    urlpatterns = [
        url(r'courses/$',course.CoursesView.as_view({'get':'list'})),
        url(r'courses/(?P<pk>d+)/$',course.CoursesView.as_view({'get':'retrieve'}))
    ]

     serializers下的course.py(也没有做改变)

    from rest_framework import serializers
    
    class CourseSerializer(serializers.Serializer):
        id = serializers.IntegerField()
        name = serializers.CharField()

     效果:

    3.1基于框架三的扩展(可以使用序列化组件ModelSerializer,它继承了Serializer)

    它的相关源码:

    这里相关代码我就不演示了,可以查看之前的代码学习相关知识

     相关说明:对于框架一和框架二适用于用户请求处理时业务逻辑复杂的情况。 

         第三种框架,由于渲染器内部会调用视图对象的get_queryset方法,所以必须要设置queryset字段。

     针对第三种解决方案:

    1. 设置queryset字段
    	class CoursesView(ListModelMixin,GenericViewSet):
    		queryset = models.Course.objects.all()
    
    		def list(self, request, *args, **kwargs):
    			course_list = models.Course.objects.all()
    			ser = CourseSerializer(instance=course_list, many=True)
    			return Response(ser.data)
    
    2. 不使用渲染器,没有那种好看的面板渲染了
    	class CoursesView(ListModelMixin,GenericViewSet):
    		renderer_classes = [JSONRenderer,]
    
    		def list(self, request, *args, **kwargs):
    			course_list = models.Course.objects.all()
    			ser = CourseSerializer(instance=course_list, many=True)
    			return Response(ser.data)
    

      

  • 相关阅读:
    Linux内核等待队列机制介绍
    对数学的思考
    Linux 进程状态
    linux内核链表
    linux内核的经典书籍
    似乎最近发的Blog又少了
    抽象——放弃细节的另外一个说法
    成长
    发现QQ的一个小问题
    放上了一篇几个月前写的东西
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9444211.html
Copyright © 2020-2023  润新知