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的
Request
和Response
而不是Django的HttpRequest
,HttpResponse
。 - 请求传入时进行身份验证,并在传给处理方法前进行权限检验。
- 任何
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的
Request
和Response
而不是Django的HttpRequest
,HttpResponse
。 - 请求传入时进行身份验证,并在传给处理方法前进行权限检验。
- 任何
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
-
顶顶顶,django有机会一定要学
-
棒
-
厉害了,NB!
-
顶顶顶!!真是太优秀了~