(未完待续)DRF(Django rest_framework)中主要的类视图和url配置

DRF类视图简介

一、DRF类视图的两个基类

1.1 APIView – rest_framework.views.APIView

主要实现
// Request 使用rest_framework中的Request对象
// Response 使用rest_framework中的Response对象
APIException异常捕获
authentication_classes(,)/[ ] 用于身份认证
permission_classes(,)/[ ] 权限检查
throttle_classes(,)/[ ] 流量控制
没有实现
get()/post()/delete()/update()的封装
数据库的查询集/序列化器的指定

1.2 GenericAPIView – rest_framework.generic.GenericAPIView

主要实现查询集和序列化器指定
serializer_class 指明视图使用的序列化器(只能指明一个)
get_serializer_class(self) 通过函数的形式根据条件,返回指定的序列化器(有选择的返回)
get_serializer(self, *args, **kwargs) 返回序列化对象 注意
queryset 指定使用的查询集
get_queryset(self) 返回指定的查询集
get_object(self) 返回模型类对象,如果不存在响应404
pagination_class 指明分页控制类
filter_backends 致命过滤控制后端
没有实现
get()/post()/delete()/update()的封装

二、五个扩展类

这五个扩展类本质是Mixin类,封装筛选、序列化过程(get()/post()/delete()/update()…的封装),封装并返回响应等,需要搭配GenericAPIView使用,继承查询集和序列化指定,封装响应
需要指定查询集和序列化器
需要实现get/post等方法,并用list方法返回响应

2.1 ListModelMixin 列表视图扩展类 -- list
2.2 RetrieveModelMixin 详情视图扩展类 -- Retrieve
2.3 CreateModelMixin 创建视图扩展类 -- Create
2.4 UpdateModelMixin 更新视图扩展类
2.5 DestoryModelMixin 删除视图扩展类

3、五个扩展类 + GenericAPIView ==> 类视图

只需要指定查询集和序列化器

3.1 ListAPIView
3.2 RetrieveAPIView
3.3 CreateAPIView
3.4 UpdateAPIView
3.5 DestoryAPIView
3.6 RetrieveUpdateAPIView
3.7 RetrieveUpdataDestoryAPIView

视图集的主要类

1、ViewSet

继承自APIView+ViewSetMixin,主要继承ViewSetMixin的as_view()实现{‘get’:’list’}映射
并没有提供任何action方法,需要自己实现
××××实现了××××
身份认证、权限校验、流量管理

2、GenericViewSet

继承自GenricAPIView+ViewSetMixin,实现指定查询集和序列化器的继承,通过继承GenericAPIView拥有了指定查询集和序列化器的属性,queryset, serializer_class等,同时继承ViewSetMixin,它主要实现了as_view()方法,将请求方法转换成action,如get-list/retrieve
同时GenericViewSet搭配ListModelMixin/RetrieveModelMixin/CreateModelMixin使用,这些类中主要实现各个action,通过as_view就可以调用了

# 继承的类有点多
class BooksAPIViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,  GenericViewSet):
    # 指定查询集和序列化器
    queryset = BookInfo.books.all()
    serializer_class = BookInfoModelSerializer
# 不需要定义任何action和请求方法,只需要在路由中指定as_view即可
url(r'^books/$', views.BookAPIViewSet.as_view({'get':'list'})),
url(r'^books/(?P<pk>\d+)/$', views.BookAPIViewSet.as_view({'get':'retrieve'})),

3、ModelViewSet

继承了GenericViewSet,拥有as_view的主要特性,同时又继承了5个扩展类,实现了各种action方法,所以是上一种继承类的缩写,有等价关系

class BooksAPIViewSet(ModelViewSet):
        queryset = BookInfo.books.all()
        serializer_class = BookInfoModelSerializer

指定url
url(r’^books/$’, views.BookAPIViewSet.as_view({‘get’:’list’})),

4、ReadOnlyModelViewSet

继承了GenericViewSet,拥有as_view的请求分发为action的特性,同时只继承了5个扩展类中的两个get请求方法对应的action-list-retrieve:ListModelMixin, RetrieveModelMixin


视图集中自定义action动作

1、直接定义方法,方法中使用查询命令得到查询对象,使用get_serializer序列化查询对象
2、在as_view指定路由的时候控制


路由的自动生成

1、非自定义视图方法,直接生成,自定义的视图方法需要添加装饰器
2、语法
router = routers.SimpleRouter()
router.register(r’books’, BookInfoViewSet, base_name=’book’)
prefix: 视图路由前缀,url前缀
viewSet: 视图集
base_name: 该条路由的名字前缀

urlpatterns += router.urls
#   or
urlpatterns = [
    url('^', include(router.urls)),
]

猜你喜欢

转载自blog.csdn.net/mrnoboday/article/details/81110656
今日推荐