GenericAPIView
GenericAPIView
位置:rest_framework.generics
继承自APIView,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
支持定义的属性:
列表视图与详情视图通用
queryset:列表视图的查询集
serializer_class:视图使用的序列化器
列表视图使用:
pagination_class:分页控制
filter_backends:过滤控制后端
详情页视图使用
lookup_field:查询单一数据库对象时使用的条件字段,默认为’pk’
lookup_url_kwarg:查询单一数据时URL中的参数关键字名称,默认与look_field相同
导入模块:
from rest_framework.generics import GenericAPIView
使用演示
演示一
重写get_quertyset()函数
演示二:使用序列化器
使用Postman发送请求后
GenericAPIView
与APIView相比,多了数据的全局指定,不用在每一个方法中都进行数据的查询,更加节省内存
优点:
1、不用再每一个方法中进行数据库的交互。
2、一次性将所有的数据都直接缓存下来,然后在方法中获取的时候就是直接在缓存中去去除数据,避免了每一次都会与数据库进行交互造成资源的大量浪费。
mixin扩展类与三级视图
扩展类
位置:rest_framework.mixins
ListModelMixin:列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码,该Mixin扩展类的list方法会对数据进行过滤和分页。
CreateModelMixin:提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码,如果序列化器对前端发送的数据验证失败,返回400错误。
RetrieveModelMixin:详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象
UpdateModelMixin:更新视图扩展类,提供update(request, *args, **kwargs)方法,可以实现局部更新。成功返回200,序列化器校验数据失败时,返回400错误。
DestroyModelMixin:删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。成功则返回204,不存在则返回404
注意:以上五个扩展类使用方法一样,需要导入扩展类,定义的视图继承扩展类与GenericAPIView类,然后直接return调用扩展类为我们提供的方法即可
ListModelMixin
导入模块:
from rest_framework.mixins import ListModelMixin
mixin扩展类最好和GenericAPIView结合使用,否则可能会报错
三级视图
为什么称之为三级试图,感觉优点违规,别人写很多代码才能实现的查询、添加、删除等逻辑,三级视图直接继承即可使用
导入模块:
from rest_framework.generics import ListAPIView
视图集与路由
视图集
使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
GET: list() 提供一组数据
GET: retrieve() 提供单个数据
POST :create() 创建数据
PUT :update() 更新数据
PATCH: partail_update, 更新部分数据
DELETE:destory() 删除数据
ViewSet视图集类不再实现get()、post()等方法,而是实现动作action如 list() 、create() 等。
导入模块:
from rest_framework.viewsets import ModelViewSet
自定义方法
路由
对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。
REST framework提供了两个router
SimpleRouter
DefaultRouter
路由参数
路由器只能结合视图集一起使用,默认只为标准了增删改查行为生成路由信息,如果想让自定义的行为也生成路由需要在自定义行为上用action装饰进行装饰。
register(prefix, viewset, base_name)
prefix:该视图集的路由前缀
viewset:视图集
basename:路由名称的前缀
如上述代码形成的路由如下:
heroapi/ name:hero-list heroapi/ name:hero-detail
使用方法
导入模块:
from rest_framework.routers import DefaultRouter
创建router对象,并注册视图集