drf - APIView 實現 CBV

APIView 的使用

  • 導入 APIView from rest_framework.view import APIView

  • 自定義類,繼承APIView,並提供和請求相關的方法

    class UserView(APIView):
    
        def get(self, request, *args, **kwargs):
            """
            查看所有的用戶
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
            serilaizer = None
            if "pk" in kwargs:
    
                queryset = User.objects.filter(pk=kwargs.get("pk")).first()
                serilaizer = UserSerializer(queryset, context={"request": request})
            else:
                queryset = User.objects.all()
                # 序列化 用戶信息
                serilaizer = UserSerializer(queryset, many=True, context={"request": request})
    
            return Response(serilaizer.data, status=status.HTTP_200_OK)
    
        def post(self, request, *args, **kwargs):
            """
            新增用戶
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
            serialzier = UserSerializer(data=request.data)
            # 校驗數據
            if serialzier.is_valid():
                serialzier.save()
                return Response(serialzier.data, status=status.HTTP_201_CREATED)
    
            return Response(serialzier.errors, status.HTTP_400_BAD_REQUEST)
    
        def put(self, request, pk, *args, **kwargs):
    
            # 1、根據主鍵、查詢用戶信息
            instance = User.objects.filter(pk=pk).first()
    
            # 2、接收頁面參數
            serializer = UserSerializer(instance=instance, data=request.data, context={"request": request})
            # 3、校驗頁面參數
            if serializer.is_valid():
                # 4、更新數據
                serializer.save()
                return Response(serializer.data)
    
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
        def delete(self, request, pk , *args, **kwargs):
    
            User.objects.filter(pk=pk).delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
    
    
    • 定義路由 urls.py

      path('users', views.UserView.as_view(), name="user-list")
      path('users/(?P<pk>\d+$)', views.UserView.as_view(), name="user-detail")
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章