上一章介绍了基于装饰器的视图函数,本章我们将介绍基于APIView类的方法,实现基于类的视图

上一章地址:https://blog.csdn.net/qq_41590764/article/details/108819233

基于类的视图有哪些优势:

开始

第一步:新建项目,app,安装,创建model...

前期准备工作就不做过多介绍了,可以参考前面的内容!!!

app名称是demo1

第二步:编写views.py

新建一个UserViewSet类,继承APIView,实现get,post请求!

class UserViewSet(APIView):

    def get(self, request):
        users = User.objects.all()
        user = UserSer(users, many=True)
        return Response(data=user.data)

    def post(self, request):
        user = UserSer(data=request.data)
        if user.is_valid():
            user.save()
            return Response(data=user.data, status=status.HTTP_200_OK)
        else:
            return Response(data=user.errors, status=status.HTTP_400_BAD_REQUEST)

新建第二个类,实现get单个数据,修改,删除数据,即put,delete请求!

class UserViewSetPutDelete(APIView):
    '''
    重写get_object方法,以定位具体某一个数据
    '''
    def get_object(self, pk):
        try:
            return User.objects.get(User_id=pk)
        except:
            # 注意这里是 raise,不是return,raise的用法,百度。。。
            raise Http404
    
    def get(self, request, pk):
        user = self.get_object(pk)
        u = UserSer(user)
        return Response(data=u.data, status=status.HTTP_200_OK)

    def put(self, request, pk):
        user = self.get_object(pk)
        u = UserSer(user, data=request.data)
        if u.is_valid():
            u.save()
            return Response(data=u.data, status=status.HTTP_200_OK)
        else:
            return Response(data=u.errors, status=status.HTTP_404_NOT_FOUND)

    def delete(self, request, pk):
        user = self.get_object(pk)
        user.delete()
        return Response(status=status.HTTP_200_OK)

第三步:使用mixins改写

使用基于类视图的最大优势之一是它可以轻松地创建可复用的行为。下面使用mixins混合改写代码

class UserViewSet(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    queryset = User.objects.all()
    serializer_class = UserSer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

DRF框架中mixins已经写好了很多方法,仅需调用即可,下面定义put,delete请求!

class UserViewSetPutDelete(mixins.RetrieveModelMixin,
                           mixins.UpdateModelMixin,
                           mixins.DestroyModelMixin,
                           generics.GenericAPIView):

    queryset = User.objects.all()
    serializer_class = UserSer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

第四步:进一步缩减代码量

后来我们发现,这样写代码也存在很多复用的情况,但generics中已经封装好了一项基础功能的代码,直接调用即可

class UserViewSet(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSer

class UserViewSetPutDelete(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSer

至此仅需6行,就实现了get,post,put,delete请求

回到最初,我们只用了三行代码即实现了增删改查,但urls.py有稍微不同!

第五步:配置url

三行代码实现的url配置,可参考第一章,地址:https://blog.csdn.net/qq_41590764/article/details/108810761

第六步:启动项目

输入ip地址:http://127.0.0.1:8000/api/

输入ip地址:http://127.0.0.1:8000/api/1/

大功告成!!!