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

网站建设行业淘宝装修模板wordpress wpquery

网站建设行业淘宝装修模板,wordpress wpquery,敬请期待还是说尽情期待,怎样制作网站开发的进度表DRF框架中viewsets.ModelViewSet、APIView区别与联系 文章目录 DRF框架中viewsets.ModelViewSet、APIView区别与联系1. 联系2. 区别3. 使用示例APIView 示例ModelViewSet 示例 4. 路由配置APIView 的路由ModelViewSet 的路由 5. 小结APIView如何自定义多个接口方法 1&#xff1…

DRF框架中viewsets.ModelViewSet、APIView区别与联系


文章目录

  • DRF框架中viewsets.ModelViewSet、APIView区别与联系
    • 1. 联系
    • 2. 区别
    • 3. 使用示例
      • APIView 示例
      • ModelViewSet 示例
    • 4. 路由配置
      • APIView 的路由
      • ModelViewSet 的路由
    • 5. 小结
    • APIView如何自定义多个接口
      • 方法 1:在 URL 中区分不同的操作
        • 示例代码
        • 请求示例
      • 方法 2:使用不同的 URL 路径
        • 示例代码
        • 路由配置
        • 请求示例
      • 方法 3:使用 `@action` 装饰器(推荐)
        • 示例代码
        • 路由配置
        • 请求示例
    • **总结**


viewsets.ModelViewSetAPIView 是 Django REST Framework (DRF) 中用于构建 API 视图的两个重要类。它们有相似之处,但也有明显的区别。以下是它们的区别与联系:


1. 联系

  • 共同点
    • 两者都用于处理 HTTP 请求(如 GETPOSTPUTDELETE 等)。
    • 都基于 DRF 的视图类体系,继承了 rest_framework.views.APIView 或其子类。
    • 都可以用于实现 RESTful API。

2. 区别

特性APIViewModelViewSet
用途用于实现自定义逻辑的视图。用于快速实现基于模型的 CRUD 操作。
代码量需要手动编写更多的代码(如 getpost 等方法)。代码量较少,默认实现了 CRUD 操作。
灵活性更灵活,适合需要自定义逻辑的场景。灵活性较低,适合标准化的 CRUD 操作。
默认方法需要手动实现所有 HTTP 方法(如 getpost 等)。默认实现了 listcreateretrieveupdatedestroy 等方法。
适用场景适用于非标准逻辑或复杂业务场景。适用于标准的模型 CRUD 操作。
路由配置需要手动配置路由。可以与 DefaultRouterSimpleRouter 配合,自动生成路由。
性能性能取决于自定义逻辑。性能较好,因为默认方法经过优化。

3. 使用示例

APIView 示例

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import MyModel
from .serializers import MyModelSerializerclass MyModelAPIView(APIView):def get(self, request, *args, **kwargs):my_models = MyModel.objects.all()serializer = MyModelSerializer(my_models, many=True)return Response(serializer.data)def post(self, request, *args, **kwargs):serializer = MyModelSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  • 特点
    • 需要手动实现 getpost 等方法。
    • 适合需要自定义逻辑的场景。

ModelViewSet 示例

from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializerclass MyModelViewSet(viewsets.ModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
  • 特点
    • 默认实现了 listcreateretrieveupdatedestroy 等方法。
    • 适合标准的 CRUD 操作。

4. 路由配置

APIView 的路由

from django.urls import path
from .views import MyModelAPIViewurlpatterns = [path('mymodels/', MyModelAPIView.as_view(), name='mymodel-list'),
]

ModelViewSet 的路由

from rest_framework.routers import DefaultRouter
from .views import MyModelViewSetrouter = DefaultRouter()
router.register(r'mymodels', MyModelViewSet)urlpatterns = router.urls
  • 特点
    • ModelViewSet 可以与 DefaultRouter 配合,自动生成路由(如 /mymodels//mymodels/<id>/ 等)。
    • APIView 需要手动配置路由。

5. 小结

选择依据APIViewModelViewSet
是否需要自定义逻辑
是否需要快速实现 CRUD
是否需要自动生成路由
  • 如果需要快速实现标准的 CRUD 操作,推荐使用 ModelViewSet
  • 如果需要实现复杂的业务逻辑或非标准操作,推荐使用 APIView

APIView如何自定义多个接口

APIView 中,默认情况下每个 HTTP 方法(如 GETPOSTPUT 等)只能定义一个对应的处理函数(如 getpostput 等)。如果你需要在同一个 APIView 中定义多个 POST 接口,可以通过以下两种方式实现:


方法 1:在 URL 中区分不同的操作

通过 URL 路径参数或查询参数来区分不同的 POST 操作,然后在 post 方法中根据参数调用不同的逻辑。

示例代码
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import statusclass MyModelAPIView(APIView):def post(self, request, *args, **kwargs):action = request.data.get('action')  # 通过请求体中的参数区分操作if action == 'create':return self.create_model(request)elif action == 'update':return self.update_model(request)else:return Response({'error': 'Invalid action'}, status=status.HTTP_400_BAD_REQUEST)def create_model(self, request):# 处理创建逻辑return Response({'message': 'Model created'}, status=status.HTTP_201_CREATED)def update_model(self, request):# 处理更新逻辑return Response({'message': 'Model updated'}, status=status.HTTP_200_OK)
请求示例
  • 创建操作:

    POST /mymodels/
    Content-Type: application/json{"action": "create","name": "New Model"
    }
    
  • 更新操作:

    POST /mymodels/
    Content-Type: application/json{"action": "update","id": 1,"name": "Updated Model"
    }
    

方法 2:使用不同的 URL 路径

通过定义不同的 URL 路径来区分不同的 POST 操作,然后在 APIView 中使用不同的方法处理。

示例代码
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import statusclass MyModelCreateAPIView(APIView):def post(self, request, *args, **kwargs):# 处理创建逻辑return Response({'message': 'Model created'}, status=status.HTTP_201_CREATED)class MyModelUpdateAPIView(APIView):def post(self, request, *args, **kwargs):# 处理更新逻辑return Response({'message': 'Model updated'}, status=status.HTTP_200_OK)
路由配置
from django.urls import path
from .views import MyModelCreateAPIView, MyModelUpdateAPIViewurlpatterns = [path('mymodels/create/', MyModelCreateAPIView.as_view(), name='mymodel-create'),path('mymodels/update/', MyModelUpdateAPIView.as_view(), name='mymodel-update'),
]
请求示例
  • 创建操作:

    POST /mymodels/create/
    Content-Type: application/json{"name": "New Model"
    }
    
  • 更新操作:

    POST /mymodels/update/
    Content-Type: application/json{"id": 1,"name": "Updated Model"
    }
    

方法 3:使用 @action 装饰器(推荐)

如果你使用的是 ViewSet 而不是 APIView,可以使用 DRF 的 @action 装饰器来定义多个 POST 接口。

示例代码
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import statusclass MyModelViewSet(viewsets.ViewSet):@action(detail=False, methods=['post'])def create_model(self, request):# 处理创建逻辑return Response({'message': 'Model created'}, status=status.HTTP_201_CREATED)@action(detail=False, methods=['post'])def update_model(self, request):# 处理更新逻辑return Response({'message': 'Model updated'}, status=status.HTTP_200_OK)
路由配置
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSetrouter = DefaultRouter()
router.register(r'mymodels', MyModelViewSet, basename='mymodel')urlpatterns = router.urls
请求示例
  • 创建操作:

    POST /mymodels/create_model/
    Content-Type: application/json{"name": "New Model"
    }
    
  • 更新操作:

    POST /mymodels/update_model/
    Content-Type: application/json{"id": 1,"name": "Updated Model"
    }
    

总结

  • 方法 1:适合简单的场景,通过请求参数区分不同操作。
  • 方法 2:适合需要明确分离不同操作的场景,通过 URL 路径区分。
  • 方法 3:推荐使用 ViewSet@action 装饰器,代码更清晰,功能更强大。

文章转载自:

http://uVGejEJG.tqsnd.cn
http://lTbssQSK.tqsnd.cn
http://WhBEKwAR.tqsnd.cn
http://gkcbbTke.tqsnd.cn
http://TkDkCDKz.tqsnd.cn
http://9YWc3GuD.tqsnd.cn
http://EedHETcd.tqsnd.cn
http://dCqw2lpN.tqsnd.cn
http://EYgrBTFq.tqsnd.cn
http://OevhnTod.tqsnd.cn
http://XJN9dkfJ.tqsnd.cn
http://VpRhKsVu.tqsnd.cn
http://bj3yPqen.tqsnd.cn
http://A3sAq4So.tqsnd.cn
http://93h8eaHo.tqsnd.cn
http://IcuJS9Rg.tqsnd.cn
http://ennhI75k.tqsnd.cn
http://JLRP88nA.tqsnd.cn
http://sTFfEv5L.tqsnd.cn
http://t4oPxqQf.tqsnd.cn
http://0sTDoABX.tqsnd.cn
http://0Jffp7TC.tqsnd.cn
http://A6Xa6H2s.tqsnd.cn
http://viQFKpv2.tqsnd.cn
http://K0xnCbat.tqsnd.cn
http://n5qRhzrV.tqsnd.cn
http://tkgIoRhU.tqsnd.cn
http://Mabk3P2V.tqsnd.cn
http://kTpWG55V.tqsnd.cn
http://iOepVmZd.tqsnd.cn
http://www.dtcms.com/wzjs/622225.html

相关文章:

  • 留言网站怎么做庙行网站建设
  • 衣服网站模板怎样做公众号
  • dw淘宝网页制作视频教程太原网站搜索引擎优化
  • 小说网站虚拟主机答建设网站
  • 网站开发如何使用API河南郑州网站建设吕凡科技
  • 怎么做一个网站出来简历模板可编辑
  • 旅游网站建设方案之目标wordpress插件检测seo是否合理
  • 浏阳烟花网站建站定位及营销功能威海建设集团网站首页
  • 网站上传的流程网站建设客户评价
  • 网站建设 网页设计 网站制作界面设计学校培训
  • 网站 自建空间网站手机版管理链接
  • 专业制作网站是什么广告策划书封面
  • 做网站一条龙网站源码大全
  • 审计局网站建设管理外贸出口流程图详细
  • 简单的个人网站python做网站源码
  • 汾阳做网站的公司响应式网站建设精英
  • 做一个属于自己的网站做网站系统的销售怎么做
  • 个人网站学生作业化州网络推广
  • 城阳做网站公司临沂 网站推广
  • 四川营销型网站建设WordPress首页可见
  • 国产 做 视频网站湖南中虹羽建设工程有限公司网站
  • 网站制作公司重庆怎么制作自己的小程序
  • 南京微网站建设西咸新区新闻
  • 响应式网站的组成网站建设丿找vx cp5173
  • 玩客云 做网站服务器十大网络游戏
  • 中阔浩潮建设工程有限公司网站深圳软件开发定制公司
  • 阿里云个人网站备案wordpress 邮箱插件
  • 稻香村网站建设做棋牌游戏网站
  • 电商网站建设概念佛山微信网站推广多少钱
  • 浙江做网站公司排名木匠手做网站