视图家族之mixins视图工具类与generics工具视图类

一、mixins视图工具类

作用:

提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。

这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。

"""
六大视图工具类:
RetrieveModelMixin,\ 单查
ListModelMixin,\ 群查
CreateModelMixin,\ 单增
UpdateModelMixin,\ 单更改,局部更改
DestroyModelMixin 删除,自己写
"""

1)ListModelMixin(群查)

列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。

该Mixin的list方法会对数据进行过滤和分页。

源代码:

class ListModelMixin(object):
"""
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)

举例:

from rest_framework.mixins import ListModelMixin

class BookListView(ListModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer def get(self, request):
return self.list(request)

2)CreateModelMixin(单增)

创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码。

如果序列化器对前端发送的数据验证失败,返回400错误。

源代码:

class CreateModelMixin(object):
"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
# 获取序列化器
serializer = self.get_serializer(data=request.data)
# 验证
serializer.is_valid(raise_exception=True)
# 保存
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) # 保存数据
def perform_create(self, serializer):
serializer.save() def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}

3) RetrieveModelMixin(单查)

详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。

如果存在,返回200, 否则返回404。

源代码:

class RetrieveModelMixin(object):
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
# 获取对象,会检查对象的权限
instance = self.get_object()
# 序列化
serializer = self.get_serializer(instance)
return Response(serializer.data)

举例:

class BookDetailView(RetrieveModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer def get(self, request, pk):
return self.retrieve(request)

4)UpdateModelMixin(单改,单局部改patch)

更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。

同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新。

成功返回200,序列化器校验数据失败时,返回400错误。

源代码:

class UpdateModelMixin(object):
"""
Update a model instance.
"""
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer) if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {} return Response(serializer.data) def perform_update(self, serializer):
serializer.save() def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)

5)DestroyModelMixin

删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。

成功返回204,不存在返回404。

源代码:

class DestroyModelMixin(object):
"""
Destroy a model instance.
"""
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT) def perform_destroy(self, instance):
instance.delete()

6)eg

class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
queryset = models.Student.objects.all()
serializer_class = StudentSerializers # 群查
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) # 单增
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)

二、generics工具视图类

1)CreateAPIView

提供 post 方法

继承自: GenericAPIView、CreateModelMixin

2)ListAPIView

提供 get 方法

继承自:GenericAPIView、ListModelMixin

3)RetrieveAPIView

提供 get 方法

继承自: GenericAPIView、RetrieveModelMixin

4)DestoryAPIView

提供 delete 方法

继承自:GenericAPIView、DestoryModelMixin

5)UpdateAPI4View

提供 put 和 patch 方法

继承自:GenericAPIView、UpdateModelMixin

6)RetrieveUpdateAPIView

提供 get、put、patch方法

继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

7)RetrieveUpdateDestoryAPIView

提供 get、put、patch、delete方法

继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

8)eg:

# GenericViewSet第二大视图类
# 与generics: 工具视图类
from rest_framework.generics import CreateAPIView, ListAPIView, ListCreateAPIView, RetrieveAPIView, UpdateAPIView, \
DestroyAPIView # 工具视图类六大功能 单增 群查
class StudentMixinListAPIView(CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView):
"""mixins.CreateModelMixin,
GenericAPIView 都继承GenericAPIView视图类
对用的功能列继承了对应工具mixins里面对应的类
1. CreateAPIView 单增
2. ListAPIView 群查
3. ListCreateAPIView 群查和单增
4 RetrieveAPIView 单增
5 UpdateAPIView 单改 put/patch 提供了整体改和局部改,utl设置pk获取修改的对象条件 self.context.get("request").user 获取request对象
6 DestroyAPIView 单删一定要重写destroy方法因为他是将一条记录删除,所以要自己写字段删除功能 单查和群查不能同时出现,因为都是get方法,只能同时访问一个
"""
# orm查询语句
queryset = models.Student.objects.all()
serializer_class = StudentSerializers
# GenericAPIView中提供lookup_field 主要是为了url中单查,提供的不一定是主键,所以提供的是数据库中的唯一主键字段名就可以
lookup_field = "id" # lookup_url_kwarg # 查找数据中的唯一键 # 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除
def destroy(self, request, *args, **kwargs):
# 字段删除
pass
# 第一个版本什么也没继承,就是原生的操作
url(r'^v1/students/$', views.StudentAPIView.as_view()),
url(r'^v1/students/(?P<pk>\d+)/$', views.StudentAPIView.as_view()), # 第二版本继承了GenericAPIView类实现了群查
url(r'^v2/students/$', views.StudentGenericAPIView.as_view()), url(r'^v2/students/(?P<pk>\d+)/$', views.StudentGenericAPIView.as_view()), # 第三个版本继承了GenericAPIView类和工具类实现了群查
url(r'^v3/students/$', views.StudentMixinGenericAPIView.as_view()), url(r'^v3/students/(?P<pk>\d+)/$', views.StudentMixinGenericAPIView.as_view()), # 第四个版本工具视图类继承了rest_framework.generics具体实现的功能
url(r'^v4/students/$', views.StudentMixinListAPIView.as_view()), url(r'^v4/students/(?P<id>\d+)/$', views.StudentMixinListAPIView.as_view()),

三、总结

  1. 视图工具类mixins

    1. 视图工具类mixins提供了五大类实现了六大方法
    2. 减少我们自己序列化的代码量,他都给封装好了
    3. 必须与GenericAPIView一起使用
  2. generics工具视图类

    1. 工具视图类是对增删改查再次进行了封装,不需要自定义类是继承GenericAPIView类
    2. 工具视图单查和群查不能同时出现在自定义类中,同时只会执行前一个
    3. 需要删除功能是我们需要自定义destroy方法因为他是将一条记录删除,所以要自己写按照字段删除功能
    4. GenericAPIView中提供lookup_field 主要是为了url中单查,提供的不一定是主键,所以提供的是数据库中 的唯一主键字段名就可以, eg: lookup_field = "id"

视图家族之mixins视图工具类与generics工具视图类的更多相关文章

  1. drf框架 - 视图家族 | GenericAPIView | mixins | generics | viewsets

    视图家族 view:视图 generics:工具视图 mixins:视图工具集 viewsets:视图集 学习曲线: APIView => GenericAPIView => mixins ...

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

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

  3. 视图家族之视图工具集viewsets

    视图家族之视图工具集viewsets 一.视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 cr ...

  4. drf二次封装response-APIViews视图家族-视图工具集-工具视图-路由组件

    视图类传递参数给序列化类 (1).在视图类中实例化 序列化对象时,可以设置context内容. (2).在序列化类中的局部钩子.全局钩子.create.update方法中,都可以用self.conte ...

  5. drf序列化组件之视图家族

    一.视图家族的分类 1.导入分类 from rest_framewok import views, generics, mixins, viewsets views:视图类 ​ 两大视图类:APIVi ...

  6. day73_10_18视图家族与序列化的传参。

    一.序列化传参 在视图类中实例化序列对象时,还有一个参数为context,这个参数是存放字典,将所有从前端传来的数据传输到序列化中,比如需要在序列化中校验当前用户. 传入的request参数也是一个对 ...

  7. drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族

    目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...

  8. 二次封装 Reponse,视图家族

    复习 """ 1.整体修改与局部修改 # 序列化 ser_obj = ModelSerializer(model_obj) # 反序列化,save() => cre ...

  9. 视图家族 & 路由组件

    目录 视图家族 & 路由组件 视图集与路由组件 基于 GenericAPIView 的十大接口 基于 generics 包下工具视图类的六大基础接口 视图集 路由组件:必须配合视图集使用 自定 ...

随机推荐

  1. POJ 2142:The Balance

    The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4781   Accepted: 2092 Descr ...

  2. POJ 1330:Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20940   Accept ...

  3. 定时自动备份mysql

    首先,利用定时shell脚本来实现 #!/bin/sh DATE=`date +%Y-%m-%d_%H:%M:%S` Pass='VHlrakBNeVNRTDNlZGMkUkZW' #加密解密密码,避 ...

  4. Linux 下配置多路径及SCSI扫描磁盘重新发现大小

    Linux SCSI扫描磁盘重新发现大小: # for i in `find /sys/class/scsi_host/host*`; do echo 1 >> $i/issue_lip; ...

  5. netty权威指南学习笔记六——编解码技术之MessagePack

    编解码技术主要应用在网络传输中,将对象比如BOJO进行编解码以利于网络中进行传输.平常我们也会将编解码说成是序列化/反序列化 定义:当进行远程跨进程服务调用时,需要把被传输的java对象编码为字节数组 ...

  6. 01-JAVA语言基础——课后动手动脑

    1.一个java类文件中真的只能有一个公有类吗? 请使用Eclipse或javac检测一下以下代码,有错吗? public class Test{    public static void main ...

  7. LeetCode#7 整数反转(数学)

    题目: 思路:(题外话:好久不刷题,明显生疏了好多,要捡起来记住当初那一份热爱!) 判断溢出的方法,在将数字反转的同时,专注在int的最大值/10和最小值/10这两个数上进行判断就可以了: 拿正数为例 ...

  8. 不得了的try catch

    try catch:几乎所有语言都有这个语句 try { //可能会导致错误的代码 } catch (error) { //在错误发生时怎么处理 }finally { //即使报错始终执行 } 1. ...

  9. Day3-T2

    原题目 奶牛Bessie的电脑总是无缘无故地被 FJ 关掉,奶牛 Bessie 非常苦恼,也非常生气.FJ 却发现了 一个很神奇的规律(别问是怎么知道的),发现 Bessie 每吃一次草,她的生气值会 ...

  10. tf.summary可视化参数

    1.tf.summary.scalar('accuracy', accuracy) 损失值.准确率随着迭代次数的进行,其指标变化情况:一般在画loss,accuary时会用到这个函数. 2.tenso ...