1.APIView

DRF框架的视图的基类是 APIView

APIView的基本使用和View类似

  1. Django默认的View请求对象是 HttpRequest,REST framework 的请求对象是 Request。

    Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。

    HttpRequest.GET ————> Request.query_params

    HttpRequest.POST 、HttpRequest.body————> Request.data

  2. Django默认的View响应对象是 HttpResponse(以及子类),REST framework 的响应对象是Response。

    构造方式:

    Response(data, status=None, template_name=None, headers=None, content_type=None)

    参数说明:

    • List item

    • data: 为响应准备的序列化处理后的数据;

    • status: 状态码,默认200;

    • template_name: 模板名称,如果使用HTMLRenderer时需指明;

    • headers: 用于存放响应头信息的字典;

    • content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。

  3. 支持定义的属性:

    • authentication_classes列表或元祖,身份认证类
    • permissoin_classes列表或元祖,权限检查类
    • throttle_classes列表或元祖,流量控制类。
  4. 在APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。如下:


    ''' serializers.py ''' class BookSerializer(serializers.ModelSerializer): class Meta:
    model = BookInfo # 设置关联模型 model就是关联模型
    fields = '__all__' # fields设置字段 __all__表示所有字段 '''urls.py'''
    url(r'^center/$',views.CenterView.as_view()) ''' views.py '''
    class CenterView(APIView): def get(self,request): # 以前的 HttpRequest.GET
    # 现在的
    # /center/?a=100&b=python
    params = request.query_params
    print(params) # 响应不同的第一个
    dict = {
    'name':'hello'
    }
    # return JsonResponse(dict) return Response(dict) # return HttpResponse('get') def post(self,request): # 以前的 HttpRequest.POST,HttpRequest.body
    # 现在
    # form 表单提交数据
    data = request.data
    print(data) return HttpResponse('post')

2. 实例:使用APIView实现列表功能


'''urls.py'''
url(r'^books/$',views.BookListAPIView.as_view()) '''views.py''' class BookListAPIView(APIView):
'''书籍列表页'''
def get(self,request):
# 1.获取所有书籍
books = BookInfo.objects.all()
# 2.通过序列化器的转换(模型转换为JSON)
serializer = BookSerializer(book,many=True)
# 3.返回响应
return Response(serializer.data) def post(self,request): # 1.接收参数
data = request.data
# 2.验证参数(序列化器的校验)
serializer = BookSerializer(data=data)
serializer.is_valid(raise_exception=True)
# 3.数据入库
serializer.save()
# 4.返回响应
return Response(serializer.data)

3.GenericAPIView

  1. GenericAPIView是继承自APIView,GenericAPIView肯定在APIView的基础上 封装了一些属性和方法:增加了对于列表视图和详情视图可能用到的通用方法和属性的支持

    属性:

    queryset 设置结果集

    serializer_class 设置序列化器

    lookup_field 查询指定的对象

    方法:

    get_queryset(self) 返回视图使用的查询集

    get_serializer(self,_args, *_kwargs) 返回序列化器对象

    get_object(self) 返回详情视图所需的模型类数据对象

  2. 通常使用时,可搭配一个或多个扩展类(Mixin类,详见4.)


##########GenericAPIView列表视图################## '''urls.py'''
url(r'^books/$',views.BookListGenericAPIView.as_view()) '''views.py''' class BookListGenericAPIView(GenericAPIView): '''列表视图''' # 查询结果集
queryset = BookInfo.objects.all()
# 序列化器类
serializer_class = BookSerializer def get(self,request): # 1.获取所有书籍
# books = BookInfo.objects.all()
# 上面写法也可以,但属性就白白浪费了,没有充分发挥属性的作用 books = self.get_queryset() # 2.创建序列化器
# serializer = BookSerializer(books,many=True)
# 以上写法也可可以,但是还是没有发挥属性的作用 # get_serializer()相当于BookSerializer()
serializer = self.get_serializer(book,many=True) # 3.返回响应
return Response(serializer.data) def post(self,request): # 1.获取参数
data = request.data
# 2.创建序列化器
serializer = self.get_serializer(data=data)
# 3.校验
serializer.is_valid(raise_exception=True)
# 4.保存
serializer.save()
# 5.返回响应
return Response(serializer.data) class BookDetailGenericAPIView(GenericAPIView): '''详情视图''' # 查询结果集
queryset = BookInfo.objects.all()
# 序列化器类
serializer_class = BookSerializer # 默认是pk 修改后以下参数都要变
lookup_field = 'id' def get(self,request,id): # 1.获取对象
book = self.get_object()
# 2.创建序列化器
serializer = self.get_serializer(book)
# 3.返回响应
return Response(serializer.data) def put(self,request,id): # 1.获取对象
book = self.get_object()
# 2.接收参数
data = request.data
# 3.创建序列化器
serializer = self.get_serializer(instance=book,data=data)
# 4.验证
serializer.is_valid(raise_exception=True)
# 5.保存(更新)
serializer.save()
# 3.返回响应
return Response(serializer.data) def delete(self,request,pk):
# 1.获取对象
book = self.get_object()
# 2.删除
book.delete()
# 3.返回响应
return Response(status=status.HTTP_204_NO_CONTENT)
  1. GenericAPIView和Mixin配合使用

    mixin类提供用于提供基本视图行为的操作。请注意,mixin类提供了操作方法,而不是直接定义处理程序方法,例如.get()和.post()。这允许更灵活的行为组合。

    • ListModelMixin

      提供一种.list(request, *args, **kwargs)实现列出查询集的方法。

    • CreateModelMixin

      提供.create(request, *args, **kwargs)实现创建和保存新模型实例的方法。

    • RetrieveModelMixin

      提供一种.retrieve(request, *args, **kwargs)方法

    • UpdateModelMixin

      提供.update(request, *args, **kwargs)实现更新和保存现有模型实例的方法。

    • DestroyModelMixin

      提供一种.destroy(request, *args, **kwargs)实现删除现有模型实例的方法。


'''urls.py'''
url(r'^booklist/$',views.BookListGenericMixinAPIView.as_view()) '''views.py''' # ListModelMixin 获取全部对象(列表)
# CreateModelMixin 新增资源
# RetrieveModelMixin 获取一个资源
# UpdateModelMixin 更新一个资源
# DestoryModelMixin 删除一个资源 class BookListGenericMixinAPIView(ListModelMixin,CreateModelMixin,GenericAPIView): # 查询结果集
queryset = BookInfo.objects.all()
# 序列化器类
serializer_class = BookSerializer def get(self,request): return self.list(request) def post(self,request): return self.create(request) def post(self,request): return self.create(request) class BookDetailGenericMixinAPIView(R,U,D): def get(self,request): return self.retrieve(request) def put(self,request): return self.update(request) def delete(self,request): return self.destroy(request)

6.三级视图

  • CreateAPIView

    提供post方法处理程序。

  • ListAPIView

    用于只读端点以表示模型实例的集合。

    提供get方法处理程序。

  • RetrieveAPIView

    用于表示单个模型实例的只读端点。

    提供get方法处理程序。

  • DestroyAPIView

    用于单个模型实例的仅删除端点。

    提供delete方法处理程序。

  • UpdateAPIView

    用于单个模型实例的仅更新端点。

    提供put和patch方法处理程序。

  • ListCreateAPIView

    用于读写端点以表示模型实例的集合。

    提供get和post方法处理程序。

  • RetrieveUpdateAPIView

    用于读取或更新端点以表示单个模型实例。

    提供get,put并且patch方法处理。

  • RetrieveDestroyAPIView

    用于读取或删除端点以表示单个模型实例。

    提供get和delete方法处理程序。

  • RetrieveUpdateDestroyAPIView

    用于读写 - 删除端点以表示单个模型实例。

    提供get,put,patch和delete方法处理。


'''urls.py'''
url(r'^booklist/$',views.Book2ListAPIView.as_view()) '''views.py''' class Book2ListAPIView(ListAPIView): # 查询结果集
queryset = BookInfo.objects.all()
# 序列化器类
serializer_class = BookSerializer

7.视图集Viewset

  1. APIView,GenericAPIView,ListAPIView 都是继承自View

    继承自View的类视图,只能定义相同的一个函数名,例如:只能定义一个get,post方法

  2. 列表视图中 设置了 queryset,serializer_class get,post

    详情视图中也设置了 queryset,serializer_class get,put,delete

    能否将这两个视图合并???

    我们是可以将 列表和详情视图 组合到一起的,称之为 视图集 ViewSet

    它不提供任何方法处理程序( 如get(),post() ),而是提供了诸如list() create()之类的操作


class BookViewSet(ViewSet): # get
def list(self,request):
queryset = BookInfo.objects.all()
serializer = BookInfoSerializer(queryset,many=True)
return Response(serializer.data)
# get
def retrieve(self,request,pk=None):
queryset = BookInfo.objects.all()
user = get_object_or_404(queryset, pk=pk)
serializer = BookInfoSerializer(user)
return Response(serializer.data) '''urls.py'''
# 继承自 ViewSet的url 可以自动生成
from rest_framework.routers import DefaultRouter,SimpleRouter # Router:的相同点 都是可以自动生成url
# Router:的不同点
# DefaultRouter 可以在根路由下显示
# SimpleRouter 不可以在根路由下显示,且会报404 # 1.创建router对象
router = DefaultRouter() # 2.设置正则
# router的原理
# router 会自动生成两个url 一个是列表视图的url 另一个是详情视图的url # 参数1:正则, 只需要设置列表视图和详情视图公共的部分
# 例如: booklist/是列表视图
# booklist/id 是详情视图
# 公共部分是 booklist 不包括/
# 参数2:视图集
# 参数3:base_name 只是我们名字url name的一个前缀
# 例如:列表视图的名字: base_name-list book-list
# 详情视图的名字: base_name-detail book-detail
router.register(r'booklist',views.BookModelViewset,base_name='book') # 3.将自动生成的url 添加到 urlpatterns中
# router.urls urls 这个属性 存放了自动生成的url
urlpatterns += router.urls # ModelViewSet 其实就是继承自 GenericAPIView,同时继承了5个扩展
class BookModelViewset(ModelViewSet): queryset = BookInfo.objects.all()
serializer_class = BookSerializer

Django通用视图APIView和视图集ViewSet的介绍和使用(Django编程-1)的更多相关文章

  1. Django通用视图APIView和视图集ViewSet的介绍和使用

    原 Django通用视图APIView和视图集ViewSet的介绍和使用 2018年10月21日 14:42:14 不睡觉假扮古尔丹 阅读数:630   1.APIView DRF框架的视图的基类是 ...

  2. [Django REST framework - 视图组件之视图基类、视图扩展类、视图子类、视图集]

    [Django REST framework - 视图组件之视图基类.视图扩展类.视图子类.视图集] 视图继承关系 详图见文章末尾 视图组件可点我查看 两个视图基类:APIView.GenericAP ...

  3. Django 学习之Rest Framework 视图集与Routers与扩展功能

    一.视图集使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数 ...

  4. 视图集ViewSet

    一 .视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update ...

  5. DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集

    复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...

  6. Django通用视图执行过程

    使用通用视图后,Django请求处理过程(以ListView为例):在我们自定义的视图中: class IndexView(ListView): template_name = 'blog/index ...

  7. django通用视图(类方法)

    这周是我入职的第一周,入职第一天看到嘉兴大佬的项目代码.视图中有类方法,我感到很困惑. 联想到之前北京融360的电话面试,问我有无写过类方法……看来有必要了解下视图的类方法,上网搜了很多,原来这就是所 ...

  8. django通用视图

    通用视图 1. 前言 回想一下,在Django中view层起到的作用是相当于controller的角色,在view中实施的 动作,一般是取得请求参数,再从model中得到数据,再通过数据创建模板,返回 ...

  9. 6:django 通用视图

    上一节我们介绍了django视图函数里面几个常用的函数,这节我们来看一下django为我们提供的一些通用视图吧 在最后面有我自己的示例代码,html部分太多了就不贴了 “简单”视图函数 正如名字所言, ...

随机推荐

  1. HDU 3969 Hawk-and-Chicken(dfs+tarjan缩点优化,网上最详细解析!!!)

    Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. [HNOI2012]集合选数 BZOJ2734

    分析: 构造法...每次找到一个没有被选过的数,用这个数推出一个表格,之后在表格上跑状压DP,时间复杂度O(n) 附上代码: #include <cstdio> #include < ...

  3. Scala--特质

    一.为什么没有多重继承 c++允许多重继承 Java不允许多重继承,类只能继承一个超类,可以实现任意数量的接口. 如何继承这两个抽象基类? Scala提供“特质”而非接口:特质可以同时抽象方法和具体方 ...

  4. 2017-2018-2 20155230《网络对抗技术》实验5:MSF基础应用

    基础问题回答 用自己的话解释什么是exploit,payload,encode. exploit 就是运行该模块吧,在msf的模块中配置好各项属性后exploit一下就开始运行使用该模块了 paylo ...

  5. 课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现

    个人贡献 熟悉试验箱各元件功能以及连接组装试验箱 一.实验内容 研究实验箱串口.USB线的调通连接 二.实践步骤 1.打开实验箱,首先了解各元件功能 这个是LTE模块,也叫4G模块,具体的作用是硬件将 ...

  6. CISCN 应用环境相关指令备忘录

    1 - 关于Python环境的 使用Anaconda2管理Python环境 1.1 - 安装 官网下载安装包下载. 1.2 - 创建Python环境 localhost:template mac$ c ...

  7. CS190.1x-ML_lab1_review_student

    这是CS190.1x第一次作业,主要教你如何使用numpy.numpy可以说是python科学计算的基础包了,用途非常广泛.相关ipynb文件见我github. 这次作业主要分成5个部分,分别是:数学 ...

  8. Package 设计3:数据源的提取和使用暂存

    SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 在使用SSIS Package处理海量数据时, ...

  9. effective c++ 笔记 (13-17)

    //---------------------------15/03/30---------------------------- //#13   以对象管理资源 { void f() { Inves ...

  10. BUGKU--刷题

    刷题 一.BUGKU WEB 1. 变量1 知识点php两个$$是 可变变量,就是一个变量的变量名可以动态的设置和使用 $GLOBALS一个包含了全部变量的全局组合数组.变量的名字就是数组的键 < ...