APIView(基本视图类)

  •  

     

     

     

  •  

     

     

  • 做学生模型的五个接口
  • urls:
  • from . import views
    from django.urls import path
    
    urlpatterns = [
        path("d1/",views.StudentList1APIView.as_view()),
        path("d1/<int:pk>/",views.Student2APIView.as_view()),
    ]

     

  • 序列化器:
  • from FRAMEWORK.models import Student
    from rest_framework import serializers
    class StudentModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Student
            fields = "__all__"

     

  • 视图层:
  • 复制代码
    from FRAMEWORK.models import Student
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from demo.serializers import StudentModelSerializer  # 导入写好的序列化器
    from rest_framework import status
    
    """
    GET  /students/ 获取多条数据
    POST /students /添加一条数据
    """
    
    
    class StudentList1APIView(APIView):
        def get(self, request):
            # 获取多条数据
            # 数据库查询
            student_list = Student.objects.all()
            # 序列化
            serializer = StudentModelSerializer(student_list, many=True)
            # 返还前端
            return Response(serializer.data)
    
        def post(self, request):
            # 添加一条数据
            # 接收数据,实例化序列化器,并用接受的数据作为参数
            serializer = StudentModelSerializer(data=request.data)
            # 反序列化,用is_valid做字段校验
            serializer.is_valid(raise_exception=True)
            # 反序列化,save保存数据
            serializer.save()
            # 反序列化,新增数据返回给客户端
            return Response(serializer.data, status=status.HTTP_201_CREATED)
    
    
    """
    GET /students/<pk>获取一条数据
    PUT /students/<pk>更新一条数据
    DELETE /students/<pk>删除一条数据
    """
    
    
    class Student2APIView(APIView):
        def get(self, request, pk):
            # 获取一条数据
            try:
                # 操作模型,根据pk指定获取对象
                student = Student.objects.get(pk=pk)
                # 实例化序列化器
                serializer = StudentModelSerializer(instance=student)
                # 返回序列化后的数据
                return Response(serializer.data)
            except Student.DoesNotExist:
                return Response({"msg": "当前学生不存在"}, status=status.HTTP_404_NOT_FOUND)
    
        def put(self, request, pk):
            # 更新一条数据
            try:
                student = Student.objects.get(pk=pk)
                serializer = StudentModelSerializer(instance=student,data=request.data)
                serializer.is_valid(raise_exception=True)
                serializer.save()
                return Response(serializer.data)
            except Student.DoesNotExist:
                return Response({"msg":"当前学生不存在,拒接更新操作"},status=status.HTTP_404_NOT_FOUND)
    
        def delete(self, request, pk):
            # 删除一条数据
            try:
                student = Student.objects.get(pk=pk)
                student.delete()
                return Response(status=status.HTTP_204_NO_CONTENT)
            except Student.DoesNotExist:
                return Response({"msg":"当前学生已被删除"},status=status.HTTP_404_NOT_FOUND)
    复制代码

     

  • 通用类的使用
  • 属性:serializer_class #指定序列化器
  • 方法:self.get_serializer()#获取序列化对象;self.get_serializer_class()#获取序列化类
  • 属性:queryset #指定查询集
  • 方法:self.get_queryset()#获取视图查询集;self.get_object()#获取单个数据(内含pk)
  •  

     

  • 复制代码
    """
    通用视图类:GenericAPIView 
    rest_framework.generics.GenericAPIView是APIView子类
    提供了2个属性,4个方法
    APIView中接口代码,除了部分涉及到调用模型与序列化器,其余代码比较固定
    针对增删查改的通用接口完全可以复用,即使用通用视图类
    """
    from rest_framework.generics import GenericAPIView
    
    
    class StudentList2GenericAPIView(GenericAPIView):
        queryset = Student.objects.all()
        # queryset = Student.objects #默认调用all()
        serializer_class = StudentModelSerializer
    
        def get(self, request):
            """获取多条数据"""
            # 实例化序列化器对象,获取模型对象列表,(面向对象原则,属性尽量不要直接使用)
            # 采用self.get_serializer与self.get_queryset去调用
            serializer = self.get_serializer(instance=self.get_queryset(), many=True)
            return Response(serializer.data)
    
        def post(self, request):
            """添加一条数据"""
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
    
    
    class Student2GenericAPIView(GenericAPIView):
        queryset = Student.objects.all()  # 模型对象
        serializer_class = StudentModelSerializer  # 序列化器
    
        def get(self, request, pk):
            """获取单条数据"""
            # 根据pk获取对应数据
            # instance = Student.objects.all().get(pk=pk)#原生写
            instance = self.get_object()  # 简写,且对错误进行了处理(建议)
            serializer = self.get_serializer(instance=instance)
            return Response(serializer.data)
    
        def put(self, request, pk):
            """更新一条数据"""
            instance = self.get_object()
            serializer = self.get_serializer(instance=instance, data=request.data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response(serializer.data)
    
        def delete(self, request, pk):
            """删除一条数据"""
            instance = self.get_object()
            instance.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
    复制代码

     

  • 复制代码
    """
    通用视图类结合Mixins混入类(扩展类)
    from rest_framework.mixins import ListModelMixin     获取多条数据,返回响应结果 list
    from rest_framework.mixins import CreateModelMixin   添加一条数据,返回响应结果 create
    from rest_framework.mixins import RetrieveModelMixin 获取一条数据,返回响应结果 retrieve
    from rest_framework.mixins import UpdateModelMixin   更新一条数据,返回响应结果 update和partial_update
    from rest_framework.mixins import DestroyModelMixin  删除一条数据,返回响应结果 destroy
    """
    
    from rest_framework.mixins import ListModelMixin, CreateModelMixin
    
    
    class StudentMixinModelAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
        queryset = Student.objects.all()
        serializer_class = StudentModelSerializer
    
        def get(self, request, *args, **kwargs):
            """用list方法获取多条数据"""
            return self.list(request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            """create添加一条数据"""
            return self.create(request, *args, **kwargs)
    
    
    from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
    
    
    class Student2MixinModelAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
        queryset = Student.objects.all()
        serializer_class = StudentModelSerializer
    
        def get(self, request, *args, **kwargs):
            """retrieve获取一条数据"""
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            """update更新一条数据"""
            return self.update(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            """destroy删除一条数据"""
            return self.destroy(request, *args, **kwargs)
    
    
    """
    上面混合还可以更精简,提供了视图子类
    单一视图子类:
        from rest_framework.generics import ListAPIView,**
        ListAPIView = GenericAPIView + ListModelMixin
        CreateAPIView = GenericAPIView + CreateModelMixin
        RetrieveAPIView = GenericAPIView + RetrieveModelMixin
        UpdateAPIView = GenericAPIView + UpdateModelMixin
        DestroyAPIView = GenericAPIView + DestroyModelMixin
        
    组合视图子类:
        #获取多条数据,+添加一条数据
        ListCreateAPIView = ListAPIView+CreateAPIView
      
    """ # 导入单一视图类 from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveAPIView, UpdateAPIView, DestroyAPIView # class StudentView1(ListAPIView, CreateAPIView, RetrieveAPIView, UpdateAPIView, DestroyAPIView): # """继承单一视图子类需要继承四个""" # queryset = Student.objects.all() # serializer_class = StudentModelSerializer # 混合使用 from rest_framework.generics import ListCreateAPIView class StudentView1(ListCreateAPIView): """多条数据查询以及添加单条数据""" queryset = Student.objects.all() serializer_class = StudentModelSerializer # 三种实现单条数据处理的导入方式 # from rest_framework.generics import RetrieveDestroyAPIView, UpdateAPIView # 组合视图类+单一试图类 # from rest_framework.generics import RetrieveUpdateAPIView, DestroyAPIView # 组合视图类+单一试图类 from rest_framework.generics import RetrieveUpdateDestroyAPIView # 完整组合视图类 class StudentView1_simple(RetrieveUpdateDestroyAPIView): """单条数据的查询,更新,删除""" queryset = Student.objects.all() serializer_class = StudentModelSerializer
    复制代码

     

  • 此时url配置来到了如下:
  • 复制代码
    from . import views
    from django.urls import path
    
    urlpatterns = [
        # 继承APIView
        path("d1/", views.StudentList1APIView.as_view()),
        path("d1/<int:pk>/", views.Student2APIView.as_view()),
        # 通用视图类:GenericAPIView
        path("d2/", views.StudentList2GenericAPIView.as_view()),
        path("d2/<int:pk>/", views.Student2GenericAPIView.as_view()),
        # 通用视图类+混入类:GenericAPIView+Mixins
        path("d3/", views.StudentMixinModelAPIView.as_view()),
        path("d3/<int:pk>", views.Student2MixinModelAPIView.as_view()),
        # 组合视图子类:ListCreateAPIView,RetrieveUpdateDestroyAPIView
        path("d4/", views.StudentView1.as_view()),
        path("d4/<int:pk>", views.StudentView1_simple.as_view()),
    ]
    复制代码

     

posted @   Hide_凉辰  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示