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

Django REST Framework(十)视图集-ViewSet

视图集(ViewSet)是 Django REST framework 中的一个高级特性,它允许你使用更少的代码来实现标准的 CRUD(创建、读取、更新、删除)操作。ViewSet 类本质上是基于 GenericAPIView 的,但它们提供了更多的默认行为,并且可以更加方便地与路由器(Router)配合使用,从而自动为你的 API 生成 URL 路由。

使用ViewSet的好处

  1. 简化路由配置:当你使用 ViewSet 时,DRF 的路由器会自动为你生成一套标准的 URL 配置,而不需要你手动去编写 URLconf。

  2. 减少代码量:ViewSet 自动包含了处理常见 HTTP 动词(GET, POST, PUT, DELETE)的方法,这大大减少了你需要编写的代码量。

  3. 易于扩展:你可以通过覆盖特定的方法来自定义行为,例如覆盖 create, update, list, retrieve 等方法。

用法

  1. 导入所需模块

     
    from rest_framework import viewsets 
    from .models import BookModel 
    from .serializers import BookModelSerializer

  2. 创建视图集

    定义一个 ViewSet 类,这个类可以继承自 viewsets.ViewSet 或者更具体的 viewsets.ModelViewSetviewsets.ModelViewSet 包含了所有的 CRUD 操作,因此对于大多数基于模型的视图

    class BookModelViewSet(viewsets.ModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializer

    这里,MyModelViewSet 将自动提供以下动作:

    1. list: 列出所有对象
    2. retrieve: 获取单个对象的详情
    3. create: 创建一个新对象
    4. update: 更新一个现有对象
    5. partial_update: 部分更新一个现有对象
    6. destroy: 删除一个对象
  3. 路由配置

    在项目的 urls.py 文件中引入 DRF 的 DefaultRouter,并注册你的 ViewSet

    from django.urls import include, path
    from rest_framework.routers import DefaultRouter
    from .views import BookModelViewSetrouter = DefaultRouter()
    router.register(r'Bookmodels', BookModelViewSet)urlpatterns = [path('', include(router.urls)),
    ]

        路由器会自动为你的 ViewSet 生成 URL 模式,你无需手动指定每个 URL。最终的 URL 可能类似于 /Bookmodels//Bookmodels/{pk}/ 

常用功能

  • queryset:定义视图集所使用的查询集。
  • serializer_class:定义视图集所使用的序列化器类。
  • get_queryset():返回视图集的查询集,通常用于动态地调整查询集。
  • get_serializer_class():返回视图集的序列化器类,通常用于根据不同的操作返回不同的序列化器。

自定义行为

如果你需要自定义某些行为,可以重写视图集的方法。例如:

class BookModelViewSet(viewsets.ModelViewSet):# ...def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())# ... 进行额外的过滤、排序或其他操作 ...serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)def perform_create(self, serializer): # 自定义创建行为     serializer.save(owner=self.request.book)

http://www.lryc.cn/news/401238.html

相关文章:

  • sping总览
  • 【Godot4.2】MLTag类:HTML、XML通用标签类
  • 美式键盘 QWERTY 布局的起源
  • 【JavaEE】HTTP(2)
  • LinuxShell编程2——shell搭建Discuzz论坛网站
  • .NET MAUI开源架构_1.学习资源分享
  • Unsloth 微调 Llama 3
  • 热修复的原理
  • 【对顶堆 优先队列】2102. 序列顺序查询
  • Go 语言中的互斥锁 Mutex
  • CSS 中的 ::before 和 ::after 伪元素
  • JuiceFS缓存特性
  • R语言实现SVM算法——分类与回归
  • React@16.x(57)Redux@4.x(6)- 实现 bindActionCreators
  • 【深度学习入门篇 ⑦】PyTorch池化层
  • 【Pytorch】数据集的加载和处理(一)
  • 论文翻译:Explainability for Large Language Models: A Survey
  • 38 IRF+链路聚合+ACL+NAT组网架构
  • 【昇思学习打卡营打卡-第二十八天】MindNLP ChatGLM-6B StreamChat
  • 前端打包部署后源码安全问题总结
  • 扩展你的App:Xcode中App Extensions的深度指南
  • 【D3.js in Action 3 精译】1.3 D3 视角下的数据可视化最佳实践(下)
  • Solus Linux简介
  • 常见的排序算法,复杂度
  • 鸿蒙特色物联网实训室
  • JVM垃圾回收-----垃圾分类
  • 前端基础之JavaScript学习——变量、数据类型、类型转换
  • SQL常用数据过滤---IN操作符
  • HDFS和FDFS
  • Flutter对接FlutterBugly 报错Zone mismatch