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

fuzzz的wordpress模板/高平网站优化公司

fuzzz的wordpress模板,高平网站优化公司,做简历的网站有,哪些网站可以做问卷调查赚钱(留存备忘,转自author:骆昊) 目录 使用CBV 数据分页 数据筛选 使用CBV创建数据接口的特点是代码简单,开发效率高,但是没有FBV(基于函数的视图)灵活,因为使用FBV的方式…

(留存备忘,转自author:骆昊)

目录

使用CBV

数据分页

数据筛选


使用CBV创建数据接口的特点是代码简单,开发效率高,但是没有FBV(基于函数的视图)灵活,因为使用FBV的方式,数据接口对应的视图函数执行什么样的代码以及返回什么的数据是高度可定制的。下面我们以定制学科的数据接口为例,讲解通过CBV方式定制数据接口的具体做法。

使用CBV

继承APIView的子类

修改之前项目中的polls/views.py,去掉show_subjects视图函数,添加一个名为SubjectView的类,该类继承自ListAPIViewListAPIView能接收GET请求,它封装了获取数据列表并返回JSON数据的get方法。ListAPIViewAPIView 的子类,APIView还有很多的子类,例如CreateAPIView可以支持POST请求,UpdateAPIView可以支持PUT和PATCH请求,DestoryAPIView可以支持DELETE请求。SubjectView 的代码如下所示。

from rest_framework.generics import ListAPIViewclass SubjectView(ListAPIView):# 通过queryset指定如何获取学科数据queryset = Subject.objects.all()# 通过serializer_class指定如何序列化学科数据serializer_class = SubjectSerializer

刚才说过,由于SubjectView的父类ListAPIView已经实现了get方法来处理获取学科列表的GET请求,所以我们只需要声明如何获取学科数据以及如何序列化学科数据,前者用queryset属性指定,后者用serializer_class属性指定。要使用上面的SubjectView,需要修改urls.py文件,如下所示。

urlpatterns = [path('api/subjects/', SubjectView.as_view()),   
]

很显然,上面的做法较之之前讲到的FBV要简单很多。

继承ModelViewSet

如果学科对应的数据接口需要支持GET、POST、PUT、PATCH、DELETE请求来支持对学科资源的获取、新增、更新、删除操作,更为简单的做法是继承ModelViewSet来编写学科视图类。再次修改polls/views.py文件,去掉SubjectView类,添加一个名为SubjectViewSet的类,代码如下所示。

from rest_framework.viewsets import ModelViewSetclass SubjectViewSet(ModelViewSet):queryset = Subject.objects.all()serializer_class = SubjectSerializer

通过查看ModelViewSet类的源代码可以发现,该类共有6个父类,其中前5个父类分别实现对POST(新增学科)、GET(获取指定学科)、PUT/PATCH(更新学科)、DELETE(删除学科)和GET(获取学科列表)操作的支持,对应的方法分别是createretrieveupdatedestroylist。由于ModelViewSet的父类中已经实现了这些方法,所以我们几乎没有编写任何代码就完成了学科数据全套接口的开发,我们要做的仅仅是指出如何获取到数据(通过queryset属性指定)以及如何序列化数据(通过serializer_class属性指定),这一点跟上面继承APIView的子类做法是一致的。

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

要使用上面的SubjectViewSet,需要在urls.py文件中进行URL映射。由于ModelViewSet相当于是多个视图函数的汇总,所以不同于之前映射URL的方式,我们需要先创建一个路由器并通过它注册SubjectViewSet,然后将注册成功后生成的URL一并添加到urlspattern列表中,代码如下所示。

from rest_framework.routers import DefaultRouterrouter = DefaultRouter()
router.register('api/subjects', SubjectViewSet)
urlpatterns += router.urls

除了ModelViewSet类外,DRF还提供了一个名为ReadOnlyModelViewSet 的类,从名字上就可以看出,该类是只读视图的集合,也就意味着,继承该类定制的数据接口只能支持GET请求,也就是获取单个资源和资源列表的请求。

数据分页

在使用GET请求获取资源列表时,我们通常不会一次性的加载所有的数据,除非数据量真的很小。大多数获取资源列表的操作都支持数据分页展示,也就说我们可以通过指定页码(或类似于页码的标识)和页面大小(一次加载多少条数据)来获取不同的数据。我们可以通过对QuerySet对象的切片操作来实现分页,也可以利用Django框架封装的PaginatorPage对象来实现分页。使用DRF时,可以在Django配置文件中修改REST_FRAMEWORK并配置默认的分页类和页面大小来实现分页,如下所示。

REST_FRAMEWORK = {'PAGE_SIZE': 10,'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination'
}

除了上面配置的PageNumberPagination分页器之外,DRF还提供了LimitOffsetPaginationCursorPagination分页器,值得一提的是CursorPagination,它可以避免使用页码分页时暴露网站的数据体量,有兴趣的读者可以自行了解。如果不希望使用配置文件中默认的分页设定,可以在视图类中添加一个pagination_class属性来重新指定分页器,通常可以将该属性指定为自定义的分页器,如下所示。

from rest_framework.pagination import PageNumberPaginationclass CustomizedPagination(PageNumberPagination):# 默认页面大小page_size = 5# 页面大小对应的查询参数page_size_query_param = 'size'# 页面大小的最大值max_page_size = 50
class SubjectView(ListAPIView):# 指定如何获取数据queryset = Subject.objects.all()# 指定如何序列化数据serializer_class = SubjectSerializer# 指定如何分页pagination_class = CustomizedPagination

如果不希望数据分页,可以将pagination_class属性设置为None来取消默认的分页器。

数据筛选

如果希望使用CBV定制获取老师信息的数据接口,也可以通过继承ListAPIView来实现。但是因为要通过指定的学科来获取对应的老师信息,因此需要对老师数据进行筛选而不是直接获取所有老师的数据。如果想从请求中获取学科编号并通过学科编号对老师进行筛选,可以通过重写get_queryset方法来做到,代码如下所示。

class TeacherView(ListAPIView):serializer_class = TeacherSerializerdef get_queryset(self):queryset = Teacher.objects.defer('subject')try:sno = self.request.GET.get('sno', '')queryset = queryset.filter(subject__no=sno)return querysetexcept ValueError:raise Http404('No teachers found.')

除了上述方式之外,还可以使用三方库django-filter来配合DRF实现对数据的筛选,使用django-filter后,可以通过为视图类配置filter-backends属性并指定使用DjangoFilterBackend来支持数据筛选。在完成上述配置后,可以使用filter_fields 属性或filterset_class属性来指定如何筛选数据,有兴趣的读者可以自行研究。

http://www.lbrq.cn/news/1108315.html

相关文章:

  • 最好的免费网站空间/河北seo基础知识
  • 桂林手机网站制作/常用的seo网站优化排名
  • 高端电子商务网站建设/b2b平台网站
  • 扁平化中文网站模板下载/搜索引擎推广的关键词
  • 怎样用电脑和网訨自己做网站/南宁网络优化seo费用
  • 石家庄做网站wsjz/7个湖北seo网站推广策略
  • 学做网站看那个网/搜索关键词的工具
  • 娄底网站建设建站/百度seo排名优化价格
  • 网站建设的目标人群是什么/商丘关键词优化推广
  • 外国人学做中国菜的网站/搜全网的浏览器
  • 百度搜索排名查询/seo网站优化推广
  • 北京建网站软件/网站点击量查询
  • 吉林省建设招标网站/深圳市网络seo推广平台
  • 企业做营销型网站/山东百度推广代理商
  • 做一个购物网站价格/东营优化公司
  • 网站连接怎么做/企业网站建设门户
  • 最便宜的购物app/枫林seo工具
  • 沈阳唐朝网站建设/网络营销公司排行榜
  • 老外做汉字网站/品牌互动营销案例
  • 揭阳seo快速排名/新网站 seo
  • dz插件网站和自己做的网站区别/网站制作多少钱
  • 网站建设开发方式/广告文案
  • 服装网站建设目的作用是什么/代写文章多少钱
  • 网站程序是什么意思/自媒体是什么
  • 沈阳优化网站关键词/竞价托管外包代运营
  • 人事代理网站建设/百度企业推广怎么收费
  • 手绘教学网站/windows优化大师会员兑换码
  • 男女做那个的网站/3分钟搞定网站seo优化外链建设
  • 有个专门做gif的网站/网络营销职业规划300字
  • 一个网站一年多少钱/广告传媒公司经营范围
  • 93.数字信号处理相关的一些问题
  • [论文阅读] 人工智能 + 软件工程 | 强化学习在软件工程中的全景扫描:从应用到未来
  • Ubuntu网卡驱动无效,不能连接wifi上网
  • Kubernetes Pod深度理解
  • 应用集成体系深度解析:从数据互通到流程协同
  • 【Linux】Linux异步IO-io_uring