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 实现高级功能的场景。
相关推荐
毋语天1 小时前
FastAPI 进阶实战:请求体、文件上传、响应模型与数据校验
python·fastapi·api开发·数据校验·pydantic
IT_陈寒2 小时前
Vue的computed属性怎么突然不更新了?
前端·人工智能·后端
ZhengEnCi2 小时前
09a-斯坦福 CS336 作业一:BPE 分词器
python·神经网络
测试员周周2 小时前
【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
人工智能·python·功能测试·ui·单元测试·appium·测试用例
invicinble2 小时前
spring提供的其他机制
java·后端·spring
还是鼠鼠2 小时前
AI掘金头条新闻系统 (Toutiao News)-用户注册-创建用户
后端·python·mysql·fastapi·web
灰灰勇闯IT2 小时前
DeepSeek-R1 在 CANN 上的推理部署
pytorch·python·深度学习
李广坤2 小时前
别再把 Filter、Interceptor 和 AOP 混为一谈了!从接口加解密谈 Spring 纵深架构设计
后端
我是一颗柠檬2 小时前
【MySQL全面教学】MySQL条件查询与排序Day4(2026年)
数据库·后端·mysql
她的男孩3 小时前
后台权限不只是菜单隐藏:Forge Admin 的 RBAC 权限链路拆解
java·后端·架构