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

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

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

复制代码
# simpletool/views.py

from rest_framework.views import APIView
from simpletool.serializers import ToolDetailSerializer
from django.http import Http404

class simpletoolDetail(APIView):
    def get_object(self,pk):
        try:
            return simpleTool.objects.get(pk=pk)
        except:
            raise Http404
    
    def get(self,request,pk):
        simpletool = self.get_object(pk)
        serializer = ToolDetailSerializer(simpletool)
        return Response(serializer.data)
    
    def put(self,request,pk):
        simpletool = self.get_object(pk)
        serializer = ToolDetailSerializer(simpletool,data=request.data)
        # 验证提交的数据是否合法,不合法则返回400
        if serializer.is_valid():
            # 序列化器将持有数据反序列化后,保存到数据库中
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
    
    def delete(self,request,pk):
        simpletool = self.get_object(pk)
        simpletool.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

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

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

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

复制代码
#simpletool/serializers.py
class ToolDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = simpleTool
        fields = '__all__'

配置urls.py

复制代码
#simpletool/urls.py
urlpatterns = [
    path('',views.tool_list,name='list'),
    path('<int:pk>/',views.simpletoolDetail.as_view(),name='detail'),
]

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

复制代码
#simpletool/views.py

from rest_framework import mixins
from rest_framework import generics

class simpletoolDetail(mixins.RetrieveModelMixin,
                       mixins.UpdateModelMixin,
                       mixins.DestroyModelMixin,
                       generics.GenericAPIView):
    queryset = simpleTool.objects.all()
    serializer_class = ToolDetailSerializer

    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)

我们可以让它更简单:

复制代码
#simpletool/views.py

class simpletoolList(generics.ListCreateAPIView):
    queryset = simpleTool.objects.all()
    serializer_class = ToolListSerializer
    
class simpletoolDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = simpleTool.objects.all()
    serializer_class = ToolDetailSerializer

修改urls.py

复制代码
#simpletool/urls.py
urlpatterns = [
    path('',views.simpletoolList.as_view(),name='list'),
    path('<int:pk>/',views.simpletoolDetail.as_view(),name='detail'),
]
相关推荐
财经资讯数据_灵砚智能1 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月5日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
garmin Chen5 分钟前
Prompt工程入门:让AI按你的要求工作(2)--Prompt 高阶优化与结构化设计
java·人工智能·python·ai·prompt
AC赳赳老秦7 分钟前
用 OpenClaw 整理团队技术分享:自动提取 PPT 内容、生成文字稿、同步到知识库
开发语言·python·自动化·powerpoint·wpf·deepseek·openclaw
编程大师哥8 分钟前
推导式和生成器表达式有什么区别?
python
稳如磐石.9 分钟前
北京工业计算机
大数据·人工智能·python·物联网
武子康14 分钟前
Java-17 深入浅出MyBatis Mapper Proxy 源码解析:从 getMapper 到 invoke 的完整链路
java·后端
牛栓柱16 分钟前
【后端实战】用 Supabase + React/TS 零成本构建高并发 Multi-Agent 服务
前端·数据库·人工智能·后端·react.js·前端框架
SilentSamsara25 分钟前
Pandas 工程化:多层索引、分组聚合与窗口函数的进阶用法
开发语言·python·青少年编程·pandas
甄心爱学习25 分钟前
【项目实训(个人12)】
人工智能·python·算法
何以解忧,唯有..26 分钟前
Python 字符串完全指南:从基础到高级操作
开发语言·python