当前位置: 首页 > news >正文

rest_framework框架视图集整理

from rest_framework.generics import GenericAPIView
from rest_framework.request import Request
from rest_framework import filters
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import statusfrom .models import Project
from . import serializers
from .filters import ProjectFilter
from utils.pagination import PageNumberPagination# from utils import mixins
"""# 源码中mixins.py文件中的Mixin拓展类
获取列表数据:  ListModelMixin拓展类     ->  list action方法      -> get
创建数据:     CreateModelMixin拓展类   ->  create action方法    -> post
获取详情数据:  RetrieveModelMixin拓展类 ->  retrieve action方法  -> get
更新数据:     UpdateModelMixin拓展类   ->  update action(完整更新)、partial_update action方法(部分更新) -> put、patch
删除数据:     DestroyModelMixin拓展类  ->  destroy action方法   -> delete# 源码generics.py文件中的APIView具体的通用视图
获取列表数据:  ListAPIView         -> 继承ListModelMixin、GenericAPIView
创建数据:     CreateAPIView       -> 继承CreateModelMixin、GenericAPIView
获取详情数据:  RetrieveAPIView     -> 继承RetrieveModelMixin、GenericAPIView
更新数据:     UpdateAPIView       -> 继承UpdateModelMixin、GenericAPIView
删除数据:     DestroyAPIView      -> 继承DestroyModelMixin、GenericAPIView# 源码viewsets.py文件中的ModelViewSet视图集, GenericViewSet继承了GenericAPIView
class ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet):A viewset that provides default `create()`, `retrieve()`, `update()`,`partial_update()`, `destroy()` and `list()` actions.# 源码generics.py文件中的APIView具体的混合通用视图
获取列表数据、创建数据:ListCreateAPIView
获取数据详情、更新数据:RetrieveUpdateAPIView
获取数据详情、删除数据:RetrieveDestroyAPIView
获取数据详情、更新数据、删除数据:RetrieveUpdateDestroyAPIView# 视图集
1.如果需要实现在定义路由条目时,请求方法与要调用的action方法进行一一对应,必须得继承ViewSetMixin
2.ViewSet继承了ViewSetMixin、APIView,具备请求方法与要调用的action方法进行一一对应功能、以及认证授权限流功能,但是不支持Mixin,因为没有提供get_object()、get_queryset()、geat_serializer()等方法
3.GenericViewSet继承了ViewSetMixin、GenericAPIView,具备请求方法与要调用的action方法进行一一对应功能、以及支持Mixin拓展类
4.ReadOnlyModelViewSet继承了RetrieveModelMixin、ListModelMixin、GenericViewSet,提供了读取数据的2个接口
5.ModelViewSet继承了CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin、ListModelMixin、GenericViewSet,提供了6个接口
6.ViewSetMixin类提供了请求方法与要调用的action方法进行一一对应功能,在定义路由条目时,在as_view()方法中支持接收字典数据,把请求方法名称字符串作为key,把具体要调用的action方法名字符串作为值"""# class RetrieveAPIView(mixins.RetrieveModelMixin, GenericAPIView):
#     # get是请求方法名称
#     # retrieve是action名称
#     def get(self, request, *args, **kwargs):
#         return self.retrieve(request, args, kwargs)
#
#
# class UpdateAPIView(mixins.UpdateModelMixin, GenericAPIView):
#     def put(self, request, *args, **kwargs):
#         # update是一个action,完整更新
#         return self.update(request, args, kwargs)
#
#
# class DestroyAPIView(mixins.DestroyModelMixin, GenericAPIView):
#     def delete(self, request, *args, **kwargs):
#         return self.destroy(request, args, kwargs)# class ProjectDetailView(generics.RetrieveAPIView, generics.UpdateAPIView, generics.DestroyAPIView):
class ProjectDetailView(generics.RetrieveUpdateDestroyAPIView):serializer_class = serializers.ProjectModelSerializer2queryset = Project.objects.all()# def get(self, request, *args, **kwargs):#     return self.retrieve(request, args, kwargs)# def put(self, request, *args, **kwargs):#     return self.update(request, args, kwargs)## def delete(self, request, *args, **kwargs):#     return self.destroy(request, args, kwargs)# class ProjectView(generics.ListAPIView, generics.CreateAPIView):
class ProjectView(generics.ListCreateAPIView):serializer_class = serializers.ProjectModelSerializer2queryset = Project.objects.all()search_fields = ['name', 'leader', 'desc', 'interfaces__name']filter_backends = [filters.SearchFilter, filters.OrderingFilter]filterset_class = ProjectFilterpagination_class = PageNumberPaginationordering_fields = ['name', 'id', 'leader']# def get(self, request: Request, *args, **kwargs):#     return self.list(request, args, kwargs)## def post(self, request: Request, *args, **kwargs):#     return self.create(request, args, kwargs)# class ProjectAllView(generics.RetrieveUpdateDestroyAPIView, generics.ListCreateAPIView):
#     serializer_class = serializers.ProjectModelSerializer2
#     queryset = Project.objects.all()
#     search_fields = ['name', 'leader', 'desc', 'interfaces__name']
#     filter_backends = [filters.SearchFilter, filters.OrderingFilter]
#     filterset_class = ProjectFilter
#     pagination_class = PageNumberPagination
#     ordering_fields = ['name', 'id', 'leader']# 需求:将上面5个接口全部放在同一个类视图中
# class ViewSet(ViewSetMixin, views.APIView)
# class ProjectViewSet(viewsets.ViewSet):
# class ProjectViewSet(viewsets.ViewSetMixin, generics.GenericAPIView):
# class ProjectViewSet(viewsets.GenericViewSet):
# class ProjectViewSet(
#         mixins.RetrieveModelMixin,
#         mixins.UpdateModelMixin,
#         mixins.DestroyModelMixin,
#         mixins.ListModelMixin,
#         mixins.CreateModelMixin,
#         viewsets.GenericViewSet):
class ProjectViewSet(viewsets.ModelViewSet):serializer_class = serializers.ProjectModelSerializer2queryset = Project.objects.all()search_fields = ['name', 'leader', 'desc', 'interfaces__name']filter_backends = [filters.SearchFilter, filters.OrderingFilter]filterset_class = ProjectFilterpagination_class = PageNumberPaginationordering_fields = ['name', 'id', 'leader']# def retrieve(self, request, *args, **kwargs):#     instance = self.get_object()#     serializer = self.get_serializer(instance=instance)#     return Response(serializer.data, status=status.HTTP_200_OK)## def update(self, request, *args, **kwargs):#     serializer = self.get_serializer(data=request.data, instance=self.get_object())#     serializer.is_valid(raise_exception=True)#     serializer.save()#     return Response(serializer.data, status=status.HTTP_201_CREATED)## def destory(self, request, *args, **kwargs):#     instance = self.get_object()#     instance.delete()#     return Response(None, status=status.HTTP_204_NO_CONTENT)## def list(self, request, *args, **kwargs):#     queryset = self.filter_queryset(self.get_queryset())#     page = self.paginate_queryset(queryset)#     if page is not None:#         serializer = self.get_serializer(instance=page, many=True)#         return self.get_paginated_response(serializer.data)##     serializer = self.get_serializer(instance=queryset, many=True)#     return Response(data=serializer.data, status=status.HTTP_200_OK)## def create(self, request, *args, **kwargs):#     serializer = self.get_serializer(data=request.data)#     serializer.is_valid(raise_exception=True)#     serializer.save()#     return Response(data=serializer.data, status=status.HTTP_201_CREATED)def name_detail(self, request, *args, **kwargs):instance = self.get_object()return Response({'id': instance.id,'name': instance.name})def names(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())data = [ obj.name for obj in queryset]return Response(data)
http://www.rkmt.cn/news/22382.html

相关文章:

  • SPP question regarding Issues Due To Gaming Spoofers
  • 类型安全ORM的高并发场景解决方案 - 实践
  • 提供给第三方接口的验证方法
  • vue 下拉框 vxe-select 实现人员选择下拉列表
  • 最后防线 解题报告
  • AI时代我们需要更多开发者:Shalini Kurapati的技术洞察
  • 从此,不再开口就紧张
  • 基于Qt实现百度地图路径规划功能
  • 基于C#的湿度上位机实现方案
  • C盘满了怎么清理?10种安全释放Win10/Win11空间的方法(详细图文版)
  • 2025 护眼灯生产厂家最新推荐榜:精选资深与新锐品牌,深度解析生产实力与市场口碑
  • 【IEEE出版|快至3-4个月EI检索】第五届电力系统与能源互联网国际学术会议(PoSEI 2025)
  • 复盘:如何用Coze+Kimi,搭建一个能自动分析财报的“金融助理”?
  • 详细介绍:【算法竞赛学习笔记】基础算法篇:递归再探
  • 折腾笔记:免费用上 Claude Code 的两个方案
  • 2025 年最新金蝶云服务商代理机构权威推荐排行榜:聚焦铂金伙伴技术实力与万级客户口碑,上海金蝶云最新推荐优质公司
  • 可视化图解算法64:哈希表基础
  • SqlServer Arithmetic overflow error converting expression to data type int
  • 医疗公有云市场第一!
  • 2025手持光谱仪/光谱分析仪/便携式光谱仪、矿石/元素分析仪、合金/金属/不锈钢/铝合金、贵金属、三元催化、赛普斯、IF光谱仪推荐榜
  • 在 Android 11 上构建 WiFi 热点并发协助(同时开启 STA + AP 模式)
  • 25 LCA模拟赛3T1 ROI 2012马赛克 题解
  • uni-app x开发商城系统,Swiper 轮播图
  • 昂瑞微OM6651A:国产车规级蓝牙芯片的破局者
  • 打破应用跳转流失困局,提升推广链接转化率
  • 检查cpu是否支撑minio方法
  • Codeforces Round 1058 (Div. 2) A~E
  • 2025 年生料带厂家最新推荐排行榜:解析优质品牌优势,涵盖新型、彩色、液态等多类型生料带厂家企业推荐
  • openresty开发lua-resty-openssl之对称加密解密 - liuxm
  • 腾讯云 OpenCloudOS 8 docker安装