Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类:


1. 基础视图类

这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。

常用类

  1. APIView

    • 最基本的视图类,所有其他视图类都继承自它。
    • 需要手动实现 getpostputdelete 等方法。
    • 适合需要完全自定义逻辑的场景。
    python 复制代码
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class MyView(APIView):
        def get(self, request):
            return Response({"message": "Hello, World!"})
  2. GenericAPIView

    • 继承自 APIView,提供了更多的通用功能(如 get_querysetget_serializer 等)。
    • 通常与 Mixin 类一起使用,以实现更高级的功能。
    python 复制代码
    from rest_framework.generics import GenericAPIView
    from rest_framework.response import Response
    
    class MyView(GenericAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
        def get(self, request):
            instances = self.get_queryset()
            serializer = self.get_serializer(instances, many=True)
            return Response(serializer.data)

2. 通用视图类(Generic Views)

这些视图类基于 GenericAPIView,并结合了 Mixin 类,提供了更高级的功能。

常用类

  1. ListAPIView

    • 用于实现列表视图(只读)。
    • 默认实现了 get 方法。
    python 复制代码
    from rest_framework.generics import ListAPIView
    
    class MyListView(ListAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  2. RetrieveAPIView

    • 用于实现详情视图(只读)。
    • 默认实现了 get 方法。
    python 复制代码
    from rest_framework.generics import RetrieveAPIView
    
    class MyDetailView(RetrieveAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  3. CreateAPIView

    • 用于实现创建视图。
    • 默认实现了 post 方法。
    python 复制代码
    from rest_framework.generics import CreateAPIView
    
    class MyCreateView(CreateAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  4. UpdateAPIView

    • 用于实现更新视图。
    • 默认实现了 putpatch 方法。
    python 复制代码
    from rest_framework.generics import UpdateAPIView
    
    class MyUpdateView(UpdateAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  5. DestroyAPIView

    • 用于实现删除视图。
    • 默认实现了 delete 方法。
    python 复制代码
    from rest_framework.generics import DestroyAPIView
    
    class MyDeleteView(DestroyAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  6. ListCreateAPIView

    • 结合了 ListAPIViewCreateAPIView
    • 默认实现了 getpost 方法。
    python 复制代码
    from rest_framework.generics import ListCreateAPIView
    
    class MyListCreateView(ListCreateAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  7. RetrieveUpdateAPIView

    • 结合了 RetrieveAPIViewUpdateAPIView
    • 默认实现了 getputpatch 方法。
    python 复制代码
    from rest_framework.generics import RetrieveUpdateAPIView
    
    class MyRetrieveUpdateView(RetrieveUpdateAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  8. RetrieveDestroyAPIView

    • 结合了 RetrieveAPIViewDestroyAPIView
    • 默认实现了 getdelete 方法。
    python 复制代码
    from rest_framework.generics import RetrieveDestroyAPIView
    
    class MyRetrieveDestroyView(RetrieveDestroyAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  9. RetrieveUpdateDestroyAPIView

    • 结合了 RetrieveAPIViewUpdateAPIViewDestroyAPIView
    • 默认实现了 getputpatchdelete 方法。
    python 复制代码
    from rest_framework.generics import RetrieveUpdateDestroyAPIView
    
    class MyRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer

3. 视图集(ViewSets)

视图集将多个视图逻辑组合在一起,通常与路由器(Router)一起使用,自动生成 URL 配置。

常用类

  1. ViewSet

    • 类似于 APIView,但将多个操作(如 listcreateretrieve 等)组合在一起。
    • 需要手动实现各个操作。
    python 复制代码
    from rest_framework import viewsets
    from rest_framework.response import Response
    
    class MyViewSet(viewsets.ViewSet):
        def list(self, request):
            return Response({"message": "List view"})
    
        def create(self, request):
            return Response({"message": "Create view"})
  2. ModelViewSet

    • 继承自 GenericAPIView 和多个 Mixin 类,默认实现了完整的 CRUD 操作。
    • 适合标准的模型操作。
    python 复制代码
    from rest_framework import viewsets
    
    class MyModelViewSet(viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
  3. ReadOnlyModelViewSet

    • 继承自 ModelViewSet,但只提供只读操作(listretrieve)。
    python 复制代码
    from rest_framework import viewsets
    
    class MyReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer

4. 其他视图类

  1. GenericViewSet

    • 结合了 GenericAPIViewViewSet 的功能。
    • 通常与 @action 装饰器一起使用,定义自定义操作。
    python 复制代码
    from rest_framework import viewsets
    from rest_framework.decorators import action
    from rest_framework.response import Response
    
    class MyGenericViewSet(viewsets.GenericViewSet):
        @action(detail=False, methods=['get'])
        def custom_action(self, request):
            return Response({"message": "Custom action"})
  2. mixins

    • 提供了一些通用的功能(如 ListModelMixinCreateModelMixin 等),通常与 GenericAPIViewGenericViewSet 一起使用。

总结

  • 最常用的类
    • APIView:适合完全自定义逻辑。
    • ModelViewSet:适合标准的模型 CRUD 操作。
    • ListAPIViewRetrieveAPIView 等:适合简单的只读或写操作。
    • GenericAPIView:适合需要结合 Mixin 实现高级功能的场景。
相关推荐
阿童木写作35 分钟前
跨境电商图片翻译工具推荐:批量图片翻译+视频字幕翻译+智能抠图
python·macos·音视频·xcode
cui_ruicheng1 小时前
LangChain 应用开发(十四):Agent 上下文与记忆机制
服务器·人工智能·python·langchain
circuitsosk2 小时前
任务规划器的三种范式对比:ReAct、Plan-and-Execute 与 Tree-of-Thought 在真实业务中的取舍
前端·javascript·python·react.js·llm·ai agent
shehuiyuelaiyuehao2 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
宸津-代码粉碎机2 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
测试19982 小时前
如何用appium搭建Android自动化测试框架?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
程序员大雄学编程3 小时前
微积分46. 无穷级数四大核心性质:从理论到实践的全方位解析
python·学习·微积分·学习工具
数字化转型分享点滴3 小时前
## 工厂数字化管理系统的价值体现:构建制造全流程数据闭环
python
朦胧之3 小时前
PostgreSQL 数据库笔记
人工智能·后端
2301_800074214 小时前
map,list简单方法
windows·python·list