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 实现高级功能的场景。
相关推荐
郝开几秒前
Spring Boot 2.7.18(最终 2.x 系列版本):版本概览;兼容性与支持;升级建议;脚手架工程搭建
java·spring boot·后端
重生之我要当编程大佬4 分钟前
关于打不开pycharm的解决方法(一)
ide·python·pycharm
深圳佛手10 分钟前
AI 编程工具Claude Code 介绍
人工智能·python·机器学习·langchain
天若有情67323 分钟前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
apocelipes38 分钟前
POSIX兼容系统上read和write系统调用的行为总结
linux·c语言·c++·python·golang·linux编程
暴风鱼划水1 小时前
算法题(Python)数组篇 | 6.区间和
python·算法·数组·区间和
Derrick__11 小时前
Web Js逆向——加密参数定位方法(Hook)
python·js
南汐汐月1 小时前
重生归来,我要成功 Python 高手--day33 决策树
开发语言·python·决策树
清水1 小时前
Spring Boot企业级开发入门
java·spring boot·后端
lzjava20241 小时前
Spring AI使用知识库增强对话功能
人工智能·python·spring