APIView(基本视图类)
-
- 做学生模型的五个接口
- urls:
-
from . import views from django.urls import path urlpatterns = [ path("d1/",views.StudentList1APIView.as_view()), path("d1/<int:pk>/",views.Student2APIView.as_view()), ]
- 序列化器:
-
from FRAMEWORK.models import Student from rest_framework import serializers class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = "__all__"
- 视图层:
-
from FRAMEWORK.models import Student from rest_framework.views import APIView from rest_framework.response import Response from demo.serializers import StudentModelSerializer # 导入写好的序列化器 from rest_framework import status """ GET /students/ 获取多条数据 POST /students /添加一条数据 """ class StudentList1APIView(APIView): def get(self, request): # 获取多条数据 # 数据库查询 student_list = Student.objects.all() # 序列化 serializer = StudentModelSerializer(student_list, many=True) # 返还前端 return Response(serializer.data) def post(self, request): # 添加一条数据 # 接收数据,实例化序列化器,并用接受的数据作为参数 serializer = StudentModelSerializer(data=request.data) # 反序列化,用is_valid做字段校验 serializer.is_valid(raise_exception=True) # 反序列化,save保存数据 serializer.save() # 反序列化,新增数据返回给客户端 return Response(serializer.data, status=status.HTTP_201_CREATED) """ GET /students/<pk>获取一条数据 PUT /students/<pk>更新一条数据 DELETE /students/<pk>删除一条数据 """ class Student2APIView(APIView): def get(self, request, pk): # 获取一条数据 try: # 操作模型,根据pk指定获取对象 student = Student.objects.get(pk=pk) # 实例化序列化器 serializer = StudentModelSerializer(instance=student) # 返回序列化后的数据 return Response(serializer.data) except Student.DoesNotExist: return Response({"msg": "当前学生不存在"}, status=status.HTTP_404_NOT_FOUND) def put(self, request, pk): # 更新一条数据 try: student = Student.objects.get(pk=pk) serializer = StudentModelSerializer(instance=student,data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data) except Student.DoesNotExist: return Response({"msg":"当前学生不存在,拒接更新操作"},status=status.HTTP_404_NOT_FOUND) def delete(self, request, pk): # 删除一条数据 try: student = Student.objects.get(pk=pk) student.delete() return Response(status=status.HTTP_204_NO_CONTENT) except Student.DoesNotExist: return Response({"msg":"当前学生已被删除"},status=status.HTTP_404_NOT_FOUND)
- 通用类的使用
- 属性:serializer_class #指定序列化器
- 方法:self.get_serializer()#获取序列化对象;self.get_serializer_class()#获取序列化类
- 属性:queryset #指定查询集
- 方法:self.get_queryset()#获取视图查询集;self.get_object()#获取单个数据(内含pk)
-
""" 通用视图类:GenericAPIView rest_framework.generics.GenericAPIView是APIView子类 提供了2个属性,4个方法 APIView中接口代码,除了部分涉及到调用模型与序列化器,其余代码比较固定 针对增删查改的通用接口完全可以复用,即使用通用视图类 """ from rest_framework.generics import GenericAPIView class StudentList2GenericAPIView(GenericAPIView): queryset = Student.objects.all() # queryset = Student.objects #默认调用all() serializer_class = StudentModelSerializer def get(self, request): """获取多条数据""" # 实例化序列化器对象,获取模型对象列表,(面向对象原则,属性尽量不要直接使用) # 采用self.get_serializer与self.get_queryset去调用 serializer = self.get_serializer(instance=self.get_queryset(), many=True) return Response(serializer.data) def post(self, request): """添加一条数据""" serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) class Student2GenericAPIView(GenericAPIView): queryset = Student.objects.all() # 模型对象 serializer_class = StudentModelSerializer # 序列化器 def get(self, request, pk): """获取单条数据""" # 根据pk获取对应数据 # instance = Student.objects.all().get(pk=pk)#原生写 instance = self.get_object() # 简写,且对错误进行了处理(建议) serializer = self.get_serializer(instance=instance) return Response(serializer.data) def put(self, request, pk): """更新一条数据""" instance = self.get_object() serializer = self.get_serializer(instance=instance, data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data) def delete(self, request, pk): """删除一条数据""" instance = self.get_object() instance.delete() return Response(status=status.HTTP_204_NO_CONTENT)
-
""" 通用视图类结合Mixins混入类(扩展类) from rest_framework.mixins import ListModelMixin 获取多条数据,返回响应结果 list from rest_framework.mixins import CreateModelMixin 添加一条数据,返回响应结果 create from rest_framework.mixins import RetrieveModelMixin 获取一条数据,返回响应结果 retrieve from rest_framework.mixins import UpdateModelMixin 更新一条数据,返回响应结果 update和partial_update from rest_framework.mixins import DestroyModelMixin 删除一条数据,返回响应结果 destroy """ from rest_framework.mixins import ListModelMixin, CreateModelMixin class StudentMixinModelAPIView(GenericAPIView, ListModelMixin, CreateModelMixin): queryset = Student.objects.all() serializer_class = StudentModelSerializer def get(self, request, *args, **kwargs): """用list方法获取多条数据""" return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): """create添加一条数据""" return self.create(request, *args, **kwargs) from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin class Student2MixinModelAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin): queryset = Student.objects.all() serializer_class = StudentModelSerializer def get(self, request, *args, **kwargs): """retrieve获取一条数据""" return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): """update更新一条数据""" return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): """destroy删除一条数据""" return self.destroy(request, *args, **kwargs) """ 上面混合还可以更精简,提供了视图子类 单一视图子类: from rest_framework.generics import ListAPIView,** ListAPIView = GenericAPIView + ListModelMixin CreateAPIView = GenericAPIView + CreateModelMixin RetrieveAPIView = GenericAPIView + RetrieveModelMixin UpdateAPIView = GenericAPIView + UpdateModelMixin DestroyAPIView = GenericAPIView + DestroyModelMixin 组合视图子类: #获取多条数据,+添加一条数据 ListCreateAPIView = ListAPIView+CreateAPIView
""" # 导入单一视图类 from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveAPIView, UpdateAPIView, DestroyAPIView # class StudentView1(ListAPIView, CreateAPIView, RetrieveAPIView, UpdateAPIView, DestroyAPIView): # """继承单一视图子类需要继承四个""" # queryset = Student.objects.all() # serializer_class = StudentModelSerializer # 混合使用 from rest_framework.generics import ListCreateAPIView class StudentView1(ListCreateAPIView): """多条数据查询以及添加单条数据""" queryset = Student.objects.all() serializer_class = StudentModelSerializer # 三种实现单条数据处理的导入方式 # from rest_framework.generics import RetrieveDestroyAPIView, UpdateAPIView # 组合视图类+单一试图类 # from rest_framework.generics import RetrieveUpdateAPIView, DestroyAPIView # 组合视图类+单一试图类 from rest_framework.generics import RetrieveUpdateDestroyAPIView # 完整组合视图类 class StudentView1_simple(RetrieveUpdateDestroyAPIView): """单条数据的查询,更新,删除""" queryset = Student.objects.all() serializer_class = StudentModelSerializer - 此时url配置来到了如下:
-
from . import views from django.urls import path urlpatterns = [ # 继承APIView path("d1/", views.StudentList1APIView.as_view()), path("d1/<int:pk>/", views.Student2APIView.as_view()), # 通用视图类:GenericAPIView path("d2/", views.StudentList2GenericAPIView.as_view()), path("d2/<int:pk>/", views.Student2GenericAPIView.as_view()), # 通用视图类+混入类:GenericAPIView+Mixins path("d3/", views.StudentMixinModelAPIView.as_view()), path("d3/<int:pk>", views.Student2MixinModelAPIView.as_view()), # 组合视图子类:ListCreateAPIView,RetrieveUpdateDestroyAPIView path("d4/", views.StudentView1.as_view()), path("d4/<int:pk>", views.StudentView1_simple.as_view()), ]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!