drf的各种视图



  • drf 中的各种view,viewset

    Django REST framework里有各种各样的view,关系图如下:

    视图的作用

    Django用“视图”这个概念封装处理用户请求并返回响应的逻辑。

    视图是一个可调用对象,它不仅可以是基于函数,也可以是基于类的。

    相比较与函数,基于类的视图有一些区别和优势:

    • 组织与特定HTTP方法相关的代码(GET,POST等) 可以通过单独的方法而不是条件分支来解决。
    • 面向对象的技术例如Mixin(多继承、混用)可以将代码分解成可重用的组件。
      视图函数:
    def my_view(request):
    	if request.method == 'GET':
    		# <view logic>
    		return HttpResponse('result')
    

    视图类:

    class MyView(View):
    	def get(self, request):
    		# <view logic>
    		return HttpResponse('reslut')
    

    View

    Django 中的View是所有基于类的view的父类,它负责将视图连接到URL,HTTP方法调度(GET,POST等)和其他简单功能。

    APIView

    APIView是drf中所有view的父类,本身继承自Django的View,只有简单的调度方法和健壮检查。

    和View的不同

    • 请求和返回使用的是drf的RequestResponse而不是Django的HttpRequestHttpResponse
    • 请求传入时进行身份验证,并在传给处理方法前进行权限检验。
    • 任何APIException都会被捕捉。

    使用

    Response返回的内容是序列化json。
    先创建在goods包下新建serializer.py
    某字段结果可能有多条,记得加many=True! 否则无法准确显示。

    class GoodsSerializer(serializers.ModelSerializer):
        images = GoodImagesSerializer(many=True)
        
        class Meta:
            model = Goods
            fields = "__all__"
    

    Views

    class GoodsListView(APIView):
        # 重写get方法 进行get访问时会进行的处理
        def get(self, request):
            goods = Goods.objects.all()[:10]
            goods_list = GoodsSerializer(goods, many=True)
            return Response(goods_list.data)  
    

    drf 中的各种view,viewset

    Django REST framework里有各种各样的view,关系图如下:

    视图的作用

    Django用“视图”这个概念封装处理用户请求并返回响应的逻辑。

    视图是一个可调用对象,它不仅可以是基于函数,也可以是基于类的。

    相比较与函数,基于类的视图有一些区别和优势:

    • 组织与特定HTTP方法相关的代码(GET,POST等) 可以通过单独的方法而不是条件分支来解决。
    • 面向对象的技术例如Mixin(多继承、混用)可以将代码分解成可重用的组件。
      视图函数:
    def my_view(request):
    	if request.method == 'GET':
    		# <view logic>
    		return HttpResponse('result')
    

    视图类:

    class MyView(View):
    	def get(self, request):
    		# <view logic>
    		return HttpResponse('reslut')
    

    View

    Django 中的View是所有基于类的view的父类,它负责将视图连接到URL,HTTP方法调度(GET,POST等)和其他简单功能。

    APIView

    APIView是drf中所有view的父类,本身继承自Django的View,只有简单的调度方法和健壮检查。

    和View的不同

    • 请求和返回使用的是drf的RequestResponse而不是Django的HttpRequestHttpResponse
    • 请求传入时进行身份验证,并在传给处理方法前进行权限检验。
    • 任何APIException都会被捕捉。

    使用

    Response返回的内容是序列化json。
    先创建在goods包下新建serializer.py
    某字段结果可能有多条,记得加many=True! 否则无法准确显示。

    class GoodsSerializer(serializers.ModelSerializer):
        images = GoodImagesSerializer(many=True)
        
        class Meta:
            model = Goods
            fields = "__all__"
    

    Views

    class GoodsListView(APIView):
        # 重写get方法 进行get访问时会进行的处理
        def get(self, request):
            goods = Goods.objects.all()[:10]
            goods_list = GoodsSerializer(goods, many=True)
            return Response(goods_list.data)  
    

    别忘了这是基于类的视图,所以要加上as_view()方法。

    url('GoodsListView/', GoodsListView.as_view()),
    

    GenericAPIView

    GenericAPIView继承于APIView,为标准list和detail详情提供了常用行为,每个GenericAPIView都会和一个或多个mixin联合使用。

    属性

    • 基础设置(queryset,serializer_class)
    • 分页(pagination_class)
    • 过滤(filter_backend)

    使用

    class StandardResultsSetPagination(PageNumberPagination):
        page_size = 10
        page_size_query_param = 'page_size' # GoodsListView/?p=2&page_size=3
        page_query_param = 'p' # GoodsListView/?p=2
        max_page_size = 100
    
    class GoodsListView(GenericAPIView, ListModelMixin):
        """
        商品列表
        """
        queryset = Goods.objects.all()
        # 序列化
        serializer_class = GoodsSerializer
        # 分页
        pagination_class = StandardResultsSetPagination
        # 过滤 /排序、搜索
        filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
        ordering_fields = ('add_time', )
        search_fields = ('name', 'goods_desc')
    
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    

    ListAPIView

    继承了GenericAPIView和ListModelMixin,重写了get方法

    源码

    class ListAPIView(mixins.ListModelMixin,
                      GenericAPIView):
        """
        Concrete view for listing a queryset.
        """
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    

    使用

    class GoodsListView(ListAPIView):
        """
        商品列表
        """
        queryset = Goods.objects.all()
        # 序列化
        serializer_class = GoodsSerializer
        # 分页
        pagination_class = StandardResultsSetPagination
        # 过滤 /排序、搜索
        filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
        ordering_fields = ('add_time', )
        search_fields = ('name', 'goods_desc')
    

    类似有:

    class CreateAPIView(mixins.CreateModelMixin, 									  GenericAPIView)
    
    class RetrieveAPIView(mixins.RetrieveModelMixin, 									GenericAPIView)
    
    class RetrieveUpdateAPIView(mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                GenericAPIView)
    

    GenericViewSet

    继承自GenericAPIView

    源码

    class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
        pass
    

    使用

    class GoodsListViewSet(GenericViewSet, ListModelMixin):
        """
        商品列表
        """
        queryset = Goods.objects.all()
        # 序列化
        serializer_class = GoodsSerializer
        # 分页
        pagination_class = StandardResultsSetPagination
    

    引用自drf中的各种view,viewset



  • 顶顶顶,django有机会一定要学



  • 👍


  • 核心层

    厉害了,NB!



  • 顶顶顶!!真是太优秀了~


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待