热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

drf(九)—视图

drf(九)—视图说明:drf的开发一般使用CBV进行开发,Django的原生视图类是View类,drf中使用较普通的是APIView。1.GenericAPIView该类继承于A

drf(九)—视图

说明:drf 的开发一般使用 CBV 进行开发,Django 的原生视图类是 View 类,drf 中使用较普通的是APIView


1.GenericAPIView

该类继承于APIView,只是封装了一些调用方法,完成我们的常用操作。

使用方式

class View1View(GenericAPIView):
queryset = models.Role.objects
serializer_class = RoleSerializers
pagination_class = PageNumberPagination
def get(self, request, *args, **kwargs):
roles=self.get_queryset() # 获取到数据库中的数据
pager_roles=self.paginate_queryset(roles)
ser=self.get_serializer(instance=pager_roles,many=True)
return Response(ser.data)

使用 Pycharm 查看类的继承关系

image-20220411090234548

说明:本类使用较少不做过多解释。


2.GenericViewSet

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
"""
The GenericViewSet class does not provide any actions by default,
but does include the base set of generic view behavior, such as
the `get_object` and `get_queryset` methods.
"""
pass

ViewSetMixin 优先级高于后面的 GenericAPIView 类,多继承的顺序问题。

因此我们也可以在自定义的视图中直接继承这两个类。

image-20220411095442110

class View2View(GenericViewSet):
def get(self,rewuest,*args,**kwargs):
return Response("....")

image-20220411100633111

函数as_view()报错,缺少参数,进行修改;

此时,视图的不同已经开始影响了路由系统。

re_path('^api/(?P[v1|v2]+)/viewv2/',view.View2View.as_view({'get':'list'})),

class View2View(GenericViewSet):
def list(self,rewuest,*args,**kwargs):
return Response("....")

image-20220411100935373

修改后并将该方法的名称映射为字典的值。

进行源码剖析查看为何要这样传参。

class ViewSetMixin:
@classonlymethod
def as_view(cls, actiOns=None, **initkwargs):
cls.name = None
cls.description = None
cls.suffix = None
cls.detail = None
cls.basename = None
if not actions:
raise TypeError("The `actions` argument must be provided when "
"calling `.as_view()` on a ViewSet. For example "
"`.as_view({'get': 'list'})`")
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
# 使用反射查看是否存在键,不存在则抛出异常
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r" % (
cls.__name__, key))
if 'name' in initkwargs and 'suffix' in initkwargs:
raise TypeError("%s() received both `name` and `suffix`, which are "
"mutually exclusive arguments." % (cls.__name__))
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if 'get' in actions and 'head' not in actions:
actions['head'] = actions['get']
self.action_map = actions
for method, action in actions.items():
handler = getattr(self, action)
# 使用反射进行方法。
setattr(self, method, handler)
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
update_wrapper(view, cls, updated=())
update_wrapper(view, cls.dispatch, assigned=())
view.cls = cls
view.initkwargs = initkwargs
view.actiOns= actions
return csrf_exempt(view) # 使得函数通过CSRF_TOKEN

3.ModelViewSet

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.
"""

# 本类继承更多的类。
pass

列表类

class ListModelMixin:
"""
List a queryset.
"""
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(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
# 改类帮我们写了list方法,我们不需要在进行编写

其他的类相同。

class View3View(ListModelMixin,GenericViewSet):# 只有查的功能
queryset = models.Role.objects.all()
serializer_class = RoleSerializers
pagination_class = PageNumberPagination

image-20220411134322275

因此只要继承 ModelViewSet 可以直接获得增删改查的方法。

传入需要更新的视图或者查询单条记录的时候使用路由进行传参

image-20220411140121249


总结



  1. 继承的越多,自己写的代码就越少;



  2. 影响路由系统,一个 url 会写两个路由;



  3. 使用建议



    1. 当对某张表需要具备增删改查的所有操作时使用 ModelViewSet,较好



    2. 当只实现某项功能的时候可以去单独执行某项 XXXModelMixin;

      总结:
      a.增删改查 ModelViewSet
      b.增删 CreateModelMixin,DestroyModelMixin GenericViewSet
      c.复杂逻辑 GenericViewSet 或 APIView


    3. 当业务功能较为复杂的时候使用APIView





补充:

视图的完整继承类图

viewsets



推荐阅读
  • 本文详细介绍如何结合Django框架和DRF(Django REST Framework)来设计一套有效的全局异常处理系统。这套系统不仅能够妥善处理DRF引发的异常,还能兼容Django自带的admin界面异常处理逻辑。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • 黑马头条项目:Vue 文章详情模块与交互功能实现
    本文详细介绍了如何在黑马头条项目中配置文章详情模块的路由、获取和展示文章详情数据,以及实现关注、点赞、不喜欢和评论功能。通过这些步骤,您可以全面了解如何开发一个完整的前端文章详情页面。 ... [详细]
  • 1.增加视图函数#Http:127.0.0.1booksdefshow_books(request):booksBookInfo.objects.all()returnrend ... [详细]
  • 本文介绍如何在Django项目中利用UpdateView更新数据后,根据主键(pk)自动重定向至对应的DetailView页面,实现流畅的用户交互体验。 ... [详细]
  • 日志记录对于软件开发至关重要,特别是在调试和维护阶段。通过日志,开发者能够追踪错误源头并了解系统的运行状态。本文将探讨如何在Django框架中有效配置和使用日志记录功能。 ... [详细]
  • Django小实战——在线Web计算器(利用Bootstrap进行前端开发)
    Django小实战——在线Web计算器(利用Bootstrap进行前端开发),Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文详细介绍了如何在C#程序运行期间防止系统进入休眠模式以及显示器关闭,提供了具体的实现代码示例,并解释了其应用场景。这不仅有助于提高程序的稳定性,还能优化能源管理。适合需要处理长时间任务(如下载或批处理)的开发者参考。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • DCG 创始人兼首席执行官 Barry Silbert 发布致股东信,详细解答了 19 个核心问题,并分享了公司未来的发展方向。 ... [详细]
  • 本文介绍如何在Django的管理后台中为特定模型添加自定义地图功能,例如使用百度地图API根据场馆名称获取并存储地理坐标。 ... [详细]
author-avatar
Henry-lau洋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有