Django Rest Framework之视图

一:DRF视图

DRF一共有四个视图文件,分别为:

  1. views.py:视图(APIView)
  2. generics.py:工具视图
  3. mixins:视图工具集
  4. viewsets:视图集
    Django Rest Framework之视图

二:generics.GenericAPIView

GenericAPIView在APIView的基础上完成了以下功能:

  1. get_queryset()
    从类属性queryset中获取model的queryset数据
  2. get_object()
    从类属性queryset中获取model的queryset数据,再通过有名分组PK查询唯一操作对象;如果URL中有名分组不是PK,那到可以使用下面的lookup_field指定
  3. get_serializer()
    从类属性serializer_class中获得serializer序列化类
class BookGenericAPIView(GenericAPIView):
    queryset = Book.objects.filter(is_delete=False)
    serializer_class = BookModelSerializer
    lookup_field = 'pk'
    # 群取
    # def get(self, request):
    #     book_query = self.get_queryset()
    #     book_ser = self.get_serializer(book_query, many = True)
    #     return Response(book_ser.data)
    # 单取
    def get(self, request, *args, **kwargs):
        book_query = self.get_object()
        book_ser = self.get_serializer(book_query)
        return Response(book_ser.data)

三:mixins中的视图工具类

mixins.py视图文件中提供了五个视图方法,如下:
Django Rest Framework之视图
该五个视图方法配合generics.GenericAPIView方法使用
注意:DestroyModelMixin方法中的删除操作是物理删除,非逻辑删除。生产环境中可将该方法重写做逻辑删除。

from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin

class BookMixinGenericView(ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, GenericAPIView):
    queryset = Book.objects.filter(is_delete=False)
    serializer_class = BookModelSerializer

    def get(self, request, *args, **kwargs):
        if 'pk' in kwargs:
            response = self.retrieve(request, *args, **kwargs)
        else:
            response = self.list(request, *args, **kwargs)
        # response的数据存放在response.data中
        return APIResponse(results=response.data)

    def post(self, request, *args, **kwargs):
        response = self.create(request, *args, **kwargs)
        return APIResponse(results=response.data)

    def put(self, request, *args, **kwargs):
        # 整体修改:即所有字段都要走数据校验。参数partial = False
        response = self.update(request, *args, **kwargs)
        return APIResponse(results=response.data)

    def patch(self, request, *args, **kwargs):
        # 局部修改:即前端传递几个字段过来就检验几个字段,没传递过来的就不校验。参数partial = True
        response = self.partial_update(request, *args, **kwargs)
        return APIResponse(results=response.data)

四:generics中的视图工具类

generics中的视图工具类是对generics.GenericAPIView,与mixins中的五个视图工具类的进一步封装
不同的视图类中重写了不同的请求方法
Django Rest Framework之视图

# ListCreateAPIView方法中提供群查,单增功能
class BookListCreateView(generics.ListCreateAPIView):
    queryset = Book.objects.filter(is_delete=False)
    serializer_class = BookModelSerializer

五:viewsets

Viewsets
viewsets视图集都是优先继承ViewSetMixin类,再继承一个视图类
ViewSetMixin提供了重写的as_view()方法,继承视图集的视图类,配置路由时调用as_view()必须传入 {请示名:函数名} 映射的关系字典

class BookGenericViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = Book.objects.filter(is_delete=False)
    serializer_class = BookModelSerializer
	# 下面可以重写很多方法
    # def get_list(self, request, *args, **kwargs):
    #     return self.list(request, *args, **kwargs)
    #
    # def get_retrieve(self, request, *args, **kwargs):
    #     return self.retrieve(request, *args, **kwargs)

路由配置:

re_path(r'^v5/books/$', views.BookGenericViewSet.as_view({'get': 'list'})),
re_path(r'^v5/books/(?P<pk>.*)/$', views.BookGenericViewSet.as_view({'get': 'retrieve'})),

GenericViewSet与ViewSet都继承了ViewSetMixin,as_view都可以配置 请求-函数名 映射
GenericViewSet继承的是GenericAPIView视图类,用来完成标准的model类操作接口
ViewSet继承的是APIView视图类,用来完成不需要model类参与或是非标准的model类操作接口
如:
post请求在标准的model类操作下就是新增接口,登陆的post不满足
post请求验证码的接口,不需要model类的参与

class BookModelViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.filter(is_delete=False)
    serializer_class = BookModelSerializer
	# 重写destroy方法,改为逻辑删除
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        if not instance:
            return Response('failed')
        instance.is_delete = True
        instance.save()
        return Response('success')

路由配置:

re_path(r'^v6/books/$', views.BookModelViewSet.as_view({'get': 'list', 'post': 'create'})),
re_path(r'^v6/books/(?P<pk>.*)/$', views.BookModelViewSet.as_view({'get': 'retrieve', 'put':'update', 'patch': 'partial_update', 'delete': 'destroy'})),
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值