视图额外动作


1.视图额外动作
  • 目的:扩展视图集功能,添加额外动作

  • 操作流程

    • 1,路由

    • from django.contrib import admin
      from django.urls import path, include
      from . import views
      
      urlpatterns = [
      
          path('book/', views.BookModelViewSet.as_view({'get': 'list', 'post': 'create'})),
          path('book/<int:pk>', views.BookModelViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
          path('book/bread', views.BookModelViewSet.as_view({'get': 'bread_book'})),
      ]
      
    • 2,视图

    • from django.shortcuts import render
      from rest_framework.viewsets import ModelViewSet
      from .models import *
      from .serializers import BookInfoModelSerializer
      from rest_framework.response import Response
      
      #视图集
      class BookModelViewSet(ModelViewSet):
          queryset = BookInfo.objects.all()
          serializer_class = BookInfoModelSerializer
          #获取阅读量大于20的
          def bread_book(self,request):
              #获取指定书籍
              books=BookInfo.objects.filter(bread__gt=100)
              #创建序列化器对象
              serializer=self.serializer_class(instance=books,many=True)
              #返回数据
              return Response(serializer.data)
      
    • 视图集额外动作,partial

      • 1,路由

      • from django.contrib import admin
        from django.urls import path, include
        from . import views
        
        urlpatterns = [
            ......
            path('book/update_book_bread/<int:pk>', views.BookModelViewSet.as_view({'put': 'update_book_bread'})),
        ]
        
      • 视图

      • class BookModelViewSet(ModelViewSet):
            queryset = BookInfo.objects.all()
            serializer_class = BookInfoModelSerializer
            ......
        
            def update_book_bread(self,request,pk):
                book = self.get_object() #拿到一调数据
                data = request.data #获取页面数据 
                serializer = self.get_serializer(instance=book,data=data,partial = True) #partial同意修改单个
         
                serializer.is_valid(raise_exception=True) #校验
                serializer.save() #保存
        
                return Response(serializer.data,status=201) 返回
        

文章作者: Kexuan Shi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kexuan Shi !
评论
  目录