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 实现高级功能的场景。
相关推荐
喵手9 分钟前
Python爬虫实战:针对Python官网,精准提取出每一个历史版本的版本号、发布日期以及对应的文档/详情页链接等信息,并最终清洗为标准化的CSV文件!
爬虫·python·爬虫实战·零基础python爬虫教学·python官方数据采集·采集历史版本版本号等信息·导出csv文件
Elieal16 分钟前
SpringBoot 数据层开发与企业信息管理系统实战
java·spring boot·后端
Coder_Boy_17 分钟前
Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
java·开发语言·人工智能·spring boot·后端·spring
独自破碎E22 分钟前
BISHI23 小红书推荐系统
java·后端·struts
databook23 分钟前
像搭积木一样思考:数据科学中的“自下而上”之道
python·数据挖掘·数据分析
luoluoal23 分钟前
基于python的医疗问句中的实体识别算法的研究(源码+文档)
python·mysql·django·毕业设计·源码
gustt27 分钟前
构建全栈AI应用:集成Ollama开源大模型
前端·后端·ollama
千寻girling32 分钟前
《 MongoDB 教程 》—— 不可多得的 MongoDB
前端·后端·面试
Wiittch32 分钟前
HashMap源码深度剖析
后端
啊阿狸不会拉杆33 分钟前
《机器学习导论》第 9 章-决策树
人工智能·python·算法·决策树·机器学习·数据挖掘·剪枝