• django+drf+vue 简单系统搭建 (3) - 基于类的视图


    传统Django中有基于类的视图,Drf中自然也有,目的都是实现功能的模块化继承,封装,减少重复代码。

    首先在视图中新增下面代码:

    1. # simpletool/views.py
    2. from rest_framework.views import APIView
    3. from simpletool.serializers import ToolDetailSerializer
    4. from django.http import Http404
    5. class simpletoolDetail(APIView):
    6. def get_object(self,pk):
    7. try:
    8. return simpleTool.objects.get(pk=pk)
    9. except:
    10. raise Http404
    11. def get(self,request,pk):
    12. simpletool = self.get_object(pk)
    13. serializer = ToolDetailSerializer(simpletool)
    14. return Response(serializer.data)
    15. def put(self,request,pk):
    16. simpletool = self.get_object(pk)
    17. serializer = ToolDetailSerializer(simpletool,data=request.data)
    18. # 验证提交的数据是否合法,不合法则返回400
    19. if serializer.is_valid():
    20. # 序列化器将持有数据反序列化后,保存到数据库中
    21. serializer.save()
    22. return Response(serializer.data)
    23. return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
    24. def delete(self,request,pk):
    25. simpletool = self.get_object(pk)
    26. simpletool.delete()
    27. return Response(status=status.HTTP_204_NO_CONTENT)

    上述代码为对tool的获取,修改,删除的3个方法,以及获取单个tool信息的方法,其中get(),put()就是有一部将对象序列化或者反序列化的步骤。

    # 序列化这个概念与具体语言无关,python或者javascript对象转化为json都称为序列化,反正为反序列化。

    现在来补充ToolDetailSerializer。与simpleTool列表不同,需要返回该工具所有完整的数据信息,所以需要给它新定义一个序列化器:

    1. #simpletool/serializers.py
    2. class ToolDetailSerializer(serializers.ModelSerializer):
    3. class Meta:
    4. model = simpleTool
    5. fields = '__all__'

    配置urls.py

    1. #simpletool/urls.py
    2. urlpatterns = [
    3. path('',views.tool_list,name='list'),
    4. path('/',views.simpletoolDetail.as_view(),name='detail'),
    5. ]

    httpie 测试

    http http://127.0.0.1:8000/api/simpletool/1/

     尝试修改工具名:

     http PUT http://127.0.0.1:8000/api/simpletool/1/ title=test_tool

    可以尝试将它删掉

    http DELETE http://127.0.0.1:8000/api/simpletool/1/

    1. 通用视图

    实际上,增删改查为通用操作,所以可以用DRF提供的Mixin类直接集成对应的功能:

    修改simpletoolDetail

    1. #simpletool/views.py
    2. from rest_framework import mixins
    3. from rest_framework import generics
    4. class simpletoolDetail(mixins.RetrieveModelMixin,
    5. mixins.UpdateModelMixin,
    6. mixins.DestroyModelMixin,
    7. generics.GenericAPIView):
    8. queryset = simpleTool.objects.all()
    9. serializer_class = ToolDetailSerializer
    10. def get(self, request, *args, **kwargs):
    11. return self.retrieve(request, *args, **kwargs)
    12. def put(self, request, *args, **kwargs):
    13. return self.update(request, *args, **kwargs)
    14. def delete(self, request, *args, **kwargs):
    15. return self.destroy(request, *args, **kwargs)

    我们可以让它更简单:

    1. #simpletool/views.py
    2. class simpletoolList(generics.ListCreateAPIView):
    3. queryset = simpleTool.objects.all()
    4. serializer_class = ToolListSerializer
    5. class simpletoolDetail(generics.RetrieveUpdateDestroyAPIView):
    6. queryset = simpleTool.objects.all()
    7. serializer_class = ToolDetailSerializer

    修改urls.py

    1. #simpletool/urls.py
    2. urlpatterns = [
    3. path('',views.simpletoolList.as_view(),name='list'),
    4. path('/',views.simpletoolDetail.as_view(),name='detail'),
    5. ]

  • 相关阅读:
    nodejs操作rabbitMQ amqplib库 消息持久化
    AI产品经理 | 入行AI大模型的必备知识
    msvcr120.dll丢失是什么意思,快速修复msvcr120.dll丢失的问题的方法分享
    计算机学院院长第一课——前辈的经验
    【建议收藏】逻辑回归面试题,机器学习干货、重点。
    详解FreeRTOS:FreeRTOS任务挂起过程源码分析(进阶篇—3)
    面向对象之反射
    SparkSQL 与 Hive 如何整合?关键步骤有哪些?
    vertx的学习总结4之异步数据和事件流
    华为机考:HJ3 明明的随机数
  • 原文地址:https://blog.csdn.net/weixin_44056331/article/details/134541684