在之前的django rest framework其他组件中,在视图函数中继承类都是rest_framework.view.APIView,这个APIView是继承的django中的View并且做了封装和方法重写的。 那么在django rest framework中,还有有没有提供其他的类能够继承?

一、GenericAPIView

GenericAPIViewdjango rest framework中根据APIView又做了一层封装。则继承关系就变成了GenericAPIView——>APIView——>View

from rest_framework.generics import GenericAPIView

class GenericView(GenericAPIView):
queryset = Role.objects.get_queryset().order_by('id')
serializer_class = PagerSerializer
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)

这里实现的功能和django rest framework 之 分页中的功能一样,先获取数据,分页,序列化返回。不同的是,这里由于封装的作用,GenericAPIView的内部的一些方法会根据会自动的获取数据库查询结果并分页和序列化。

  • get_queryset(): 会获取数据库查询结果,也就是queryset
  • paginate_queryset(roles):会根据重写的pagination_class属性获取分页类进行分页操作,另外如果这里没有重写,会自动到settings.py配置文件去找
  • self.get_serializer():就是根据分页后的对象进行数据的序列化,也会先找到序列化类

二、GenericViewSet

1、源码分析

GenericViewSet实际上使用了多继承和Mixin模式,也就是说GenericViewSet同时继承了ViewSetMixin, generics.GenericAPIView两个父类

# rest_framework\viewsets.py 源码

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
pass

GenericViewSet中由于类继承的先后顺序的关系,会先执行ViewSetMixin类中相关方法。而GenericAPIView类中的相关方法会被忽略。

2、路由

在执行之前要更改一下路由系统

from django.conf.urls import url

from .views import *
app_name = 'api' urlpatterns = [
url(r'^generic/$', GenericView.as_view()),
url(r'^genericset/$', GenericSetView.as_view({'get': 'list', 'post': 'create'})),
]

由于在GenericViewSet的内部重写了as_view方法,且继承关系又先于GenericAPIView类,所以会进入GenericViewSetas_view方法。但是在as_view方法中,对路由系统做了略微的改动,需要对方法,做一一映射关系。即'get': 'list', 'post': 'create',get(获取单条数据)请求,会进入子类的list方法,而create(创建对象)方法则代表了post请求。

3、视图

视图中基本上和上面一样,只不过更改了不同http请求方法的对应类方法名

from rest_framework.viewsets import GenericViewSet

class GenericSetView(GenericViewSet):
queryset = Role.objects.get_queryset().order_by('id')
serializer_class = PagerSerializer
pagination_class = PageNumberPagination def list(self,request,*args,**kwargs):
# 获取数据
roles = self.get_queryset() # models.Role.objects.all()
# [1, 1000,] [1,10]
pager_roles = self.paginate_queryset(roles)
# 序列化
ser = self.get_serializer(instance=pager_roles,many=True)
return Response(ser.data) def create(self, request, *args, **kwargs):
ret = {}
try:
title = request.data['title']
Role.objects.create(title=title)
print('success')
except Exception as e:
print(e)

4、测试

<1>、测试一

http://127.0.0.1:8000/api/genericsetget方法获取数据时,返回正常结果

<2>、测试二

http://127.0.0.1:8000/api/genericset/,表示发送post请求添加单条数据,数据添加成功

三、ModelSetView

1、源码分析

ModelSetView做的更彻底,他又一次继承了GenericViewSet,并且在此之前又继承了其他几个类,因此功能更多,变成了ModelViewSet——>GenericViewSet——>APIView——>View

class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet): pass

从这些类的名字可以大概看出,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,.ListModelMixin,分别对应,创建,获取单条数据,更新,删除,或许多条数据。

2、路由

from django.conf.urls import url
from django.urls import path from .views import *
app_name = 'api' urlpatterns = [
url(r'^modelset/(?P<pk>\d+)/$', ModelSetView.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
]

由于在获取,删除,更新数据的时候需要这顶数据的唯一标识,这里是pk主键,因此需要在url中增加正则匹配。

3、视图

在视图中,并没有增加相应的增删改查的逻辑却能完成相应的功能,这是因为继承的mixin类中,已经有一一对应的方法,视图类会自动调用父类的方法。

from rest_framework.viewsets import ModelViewSet

class ModelSetView(ModelViewSet):
queryset = Role.objects.get_queryset().order_by('id')
serializer_class = PagerSerializer
pagination_class = PageNumberPagination

获取第九条数据,返回结果

4、自定义

ModelSetView中看到,继承了多个mixin类,而这些类又分别封装了不同的对应于增删给查的方法,因此如果想要自定义一个接口,实现部分http方法,就可以根据需要继承不同的mixin

mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,

Django Rest framework 之 视图的更多相关文章

  1. Django rest framework (视图类详解)

    官网:https://www.django-rest-framework.org/api-guide/viewsets/ 在django rest framework 视图中一共有N个类 第一类:AP ...

  2. DRF Django REST framework 之 视图组件(四)

    引言 在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方.这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑. 视图组件 ...

  3. Django rest framework(8)---- 视图和渲染器

    django rest framework 之视图 序列化器    PagerSerialiser from rest_framework import serializers from api im ...

  4. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  5. Django Rest framework 之 解析器

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  6. Django Rest framework 之 版本

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  7. Django Rest framework 之 节流

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  8. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

  9. Django Rest framework 之 认证

    django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...

随机推荐

  1. Java并发编程总结1——线程状态、synchronized

    以下内容主要总结自<Java多线程编程核心技术>,不定时补充更新. 一.线程的状态 Java中,线程的状态有以下6类:NEW, RUNNABLE, BLOCKED, WAITING, TI ...

  2. C# 开发代码标准

    开发标准文件 文件名称:C#开发规范 版 本:V2.0 前言 目的是为了规范每个人的编程风格,为确保系统源程序可读性,从而增强系统可维护性,制定下述编程规范,以规范系统各部分编程.系统继承的其它资源中 ...

  3. 条件变量 sync.Cond

    sync.Cond 条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用. sync.Cond 条件变量用来协调想要访问共享资源的那些线程,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻 ...

  4. ProxySQL 部署 Single Writer Failover 读写分离 (PXC)

    主机信息: Proxysql: 如果你忽略了ProxySQL会报告主机组的变化,我建议把它设置为0,除非你试图调试"某些东西",否则你的日志将很快变得巨大.UPDATE globa ...

  5. POJ 2551

    #include<iostream> #include<stdio.h> #include<string> using namespace std; //int m ...

  6. TDD并不是看上去的那么美

    原文:http://coolshell.cn/articles/3649.html 春节前的一篇那些炒作过度的技术和概念中对敏捷和中国ThoughtWorks的微辞引发了很多争议,也惊动了中国Thou ...

  7. 使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)

    H264是当今流行的视频压缩格式:ffmpeg是一个开源库,实现了对h264视频文件的解压缩. 为了降低使用ffmpeg的复杂性,尽量隐藏实现细节,我写了一个封装库.c#也可以很方便的使用此库.解压后 ...

  8. linux上搭建ftp、vsftp, 解决访问ftp超时连接, 解决用户指定访问其根目录,解决ftp主动连接、被动连接的问题

    linux上搭建ftp 重要 解决如何搭建ftp         解决用户指定访问其根目录         解决访问ftp超时连接         解决ftp主动连接.被动连接的问题 1.安装ftp ...

  9. WPF中的TextBlock隐藏边框

    TextBlock默认是有边框的,显示效果如下:有一个淡蓝色的边框围绕着 如果需要隐藏这个边框,则只需要在代码中加上以下代码即可: BorderBrush="{x:Null}" B ...

  10. Customizing docker

    Customizing docker The Docker systemd unit can be customized by overriding the unit that ships with ...