DRF框架(下)

'''
1.request和response


DRF的request是Parser解析器处理过的请求
request.data : POST,PUT,PATCH,表单,json
request.query_params : ?后边的参数


DRF的response是Renderer渲染器处理过的响应
需要在settings中加入配置:
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
        'rest_framework.renderers.JSONRenderer',  # json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
    )
}


使用:Response(data, status=None, template_name=None, headers=None, content_type=None)  data:字典(序列化后的数据)
常用属性:
        response.data:传给response对象的序列化后,但尚未render处理的数据
        response.status_code:状态码
        response.context:经过render处理后的响应数据
有个状态码常量模块
'''




'''
2.类视图
提供一堆类视图APIView子类,就是不断继承重新,为了使用特定的方法


2-1.APIView类:(继承于django的View)
继承问题: django是继承View,现在DRF是继承APIView,Parses解释器和Renderer渲染器对request和response对象的构建,是APIView类来实现的
特点:
    任何APIException异常都会被捕获到,并且处理成合适的响应信息;
    在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制
    即可以自定义的属性: authentication_classes 列表或元祖,身份认证类
                     permissoin_classes 列表或元祖,权限检查类
                     throttle_classes 列表或元祖,流量控制类


2-2.GenericAPIView类:(继承于APIView)
增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
可以自定义的属性:
    列表视图与详情视图通用:
        queryset 列表视图的查询集
        serializer_class 视图使用的序列化器
    列表视图使用:
        pagination_class 分页控制类
        filter_backends 过滤控制后端
    详情页视图使用:
        lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
        lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同
        
可以自定义的方法:
    列表视图与详情视图通用:
        get_queryset(self)  返回视图使用的查询集
        get_serializer_class(self)  返回序列化器类
        get_serializer(self, args, *kwargs)  返回序列化器对象
    详情视图使用:
        get_object(self)  返回详情视图所需的模型类数据对象
        
# url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()), 当具体查某一本书的时候
class BookDetailView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer


    def get(self, request, pk):    书籍详情页
        book = self.get_object()    根据pk找到需要的对象
        serializer = self.get_serializer(book)  把书的对象传到序列化器中
        return Response(serializer.data)




3.扩展类:
3-1.ListModelMixin: list方法会对数据进行过滤和分页
class BookListView(ListModelMixin, GenericAPIView): 和django的Mixin扩展类继承相同
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer


    def get(self, request):
        return self.list(request)
3-2.CreateModelMixin : create方法快速实现创建资源的视图,成功返回201,数据验证失败400错误
3-3.RetrieveModelMixin : retrieve方法返回一个存在的数据对象,存在,返回200, 否则返回404
     def get(self, request, pk):
        return self.retrieve(request)
3-4.UpdateModelMixin : update方法更新一个存在的数据对象
                        partial_update局部更新, 成功返回200,序列化器校验数据失败时,返回400错误
3-5.DestroyModelMixin : destroy方法删除一个存在的数据对象,成功返回204,不存在返回404


还有几个子类视图,就是把GenericAPIView和Mixin功能写一起了,看讲义
'''




'''
3.视图集ViewSet


list() 提供一组数据
retrieve() 提供单个数据
create() 创建数据
update() 保存数据
destory() 删除数据


action行为:
url(r'^books/$', BookInfoViewSet.as_view('get', 'list')),       get方法获取所有书籍-> list方法
url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view('get', 'retrieve'))


常用视图集父类:
ViewSet(继承自APIView):提供了身份认证、权限校验、流量管理等
GenericViewSet(继承自GenericAPIView)
ModelViewSet(继承自GenericAPIVIew,同时包括了所有5个扩展)
ReadOnlyModelViewSet(继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin)


自定义action:
action装饰器: methods  支持的请求方式,列表传递,
            detail  action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)\
                    True 表示使用通过URL获取的主键对应的数据对象
                    False 表示不使用URL获取主键


# detail为False 表示不需要处理具体的BookInfo对象 
@action(methods=['get'], detail=False)
def latest(self, request):
    """
    返回最新的图书信息
    """
    book = BookInfo.objects.latest('id')
    serializer = self.get_serializer(book)
    return Response(serializer.data)
        
# detail为True,表示要处理具体与pk主键对应的BookInfo对象
@action(methods=['put'], detail=True)
def read(self, request, pk):
    """
    修改图书的阅读量数据
    """
    book = self.get_object()
    book.bread = request.data.get('read')
    book.save()
    serializer = self.get_serializer(book)
    return Response(serializer.data)  
    
url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
       
'''
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值