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 实现高级功能的场景。
相关推荐
诚信爱国敬业友善4 分钟前
GUI编程(window系统→Linux系统)
linux·python·gui
查理零世20 分钟前
【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python
python·算法·蓝桥杯
customer0827 分钟前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
紫雾凌寒30 分钟前
解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
人工智能·python·神经网络·算法·机器学习·卷积神经网络
qq_4592384931 分钟前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端
灰色人生qwer35 分钟前
SpringBoot 项目配置日志输出
java·spring boot·后端
sun lover42 分钟前
conda简单命令
python·conda
阿华的代码王国1 小时前
【从0做项目】Java搜索引擎(6)& 正则表达式鲨疯了&优化正文解析
java·后端·搜索引擎·正则表达式·java项目·从0到1做项目
EQUINOX11 小时前
lab4 CSAPP:Cachelab
java·后端·spring
Mike_188702783511 小时前
1688代采下单API接口使用指南:实现商品采集与自动化下单
前端·python·自动化