DRF(Django restframework)知识点总结

本文是对DRF知识点的一些总结,很乱,因为是一边参考官方文档一边写的,没有实际操作栗子。主要参考中文网链接,另外B站上有项目实战地址,慕课网的可免费看。链接都贴在这里了:

中文网链接:https://q1mi.github.io/Django-REST-framework-documentation/tutorial/3-class-based-views_zh/

B站链接:https://www.bilibili.com/video/av40066981?from=search&seid=1846635694509988973

这玩意学会了感觉能极大的提升开发效率。

一、知识回顾与储备
    1.Mixin:
        
        python可实现多继承,但不要多继承,违反is-a原则,
        
        举个例子:
            *飞机属于交通工具,但是飞的特性不能放到交通工具中,因为轿车不会飞。飞是一个功能,单独写一个类FlyMixin,里面定义fly方法,然后
            *class Airplane(FlyMixin,Vertical):从语法上将,确实是多继承。但是FlyMixin是一个功能,少了它只是少了一个功能。不违反is-a原则。
        因此:使用Mixin类实现多重继承要非常小心
            首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等
            其次它必须责任单一,如果有多个功能,那就写多个Mixin类
            然后,它不依赖于子类的实现
            最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了^_^)


    2.Django和FBV(函数视图),CBV(类视图)
        *目前用的是函数视图
        *CVB为基于类的视图:
            所以基于类的视图有一个as_view() 类方法用来作为类的可调用入口。该as_view 入口点创建类的一个实例并调用dispatch() 方法。dispatch 查看请求是GET 还是POST 等等,并将请求转发给相应的方法,如果该方法没有定义则引发HttpResponseNotAllowed。

    3.ListView 和 DetailView:

    *ListView 主要用在获取某个 model 列表中
        通过 template_name 属性来指定需要渲染的模板,通过 context_object_name 属性来指定获取的 model 列表的名字,否则只能通过默认的 object_list 获取
        复写 get_queryset 方法以增加获取 model 列表的其他逻辑
        复写 get_context_data 方法来为上下文对象添加额外的变量以便在模板中访问.

    *DetailView 总结
    DetailView主要用在获取某个 model 的单个对象中
    通过 template_name 属性来指定需要渲染的模板,通过 context_object_name 属性来指定获取的 model 对象的名字,否则只能通过默认的 object 获取
    复写 get_object 方法以增加获取单个 model 对象的其他逻辑
    复写 get_context_data 方法来为上下文对象添加额外的变量以便在模板中访问

二、Django restframework学习

1.序列化
    *serializers.Serializer
        *要实现序列化,create(),update()
    *serializers.ModelSerializer
        *是前者的快捷方式,默认提供了一组序列化好的自动确定的字段,默认的create()和update()方法。
        *举例:class SnippetSerializer(serializers.ModelSerializer):
                class Meta:
                    model = Snippet
                    fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

2.请求和响应
*请求:REST框架引入了一个扩展了常规HttpRequest的Request对象,并提供了灵活的解析。核心为request.data,以下是request.data对比
    request.POST  # 只处理表单数据  只适用于'POST'方法
    request.data  # 处理任意数据  适用于'POST','PUT'和'PATCH'方法
*响应:REST框架还引入了一个Response对象,这是一种获取未渲染(unrendered)内容的TemplateResponse类型,并使用内容协商来确定返回给客户端的正确内容类型。
    return Response(data)  # 渲染成客户端请求的内容类型。
*状态码:status,提供更加明确的标识符
*包装器:
    用于基于函数视图的@api_view装饰器。
    用于基于类视图的APIView类。
3.基于类的视图
    *APIView
    *进阶使用mixins,将继承mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView。这里的ListModelMixin和CreateModelMixin分别提供了list()和create()功能
        *获取列表和创建功能在List中
        *取一条详细数据、更新和删除都在Detail中。
    *更简洁的方式是直接使用rest提供的混好的类:generics.ListCreateAPIView,generics.RetrieveUpdateDestroyAPIView。
4.基于类的视图集
    *以上的操作可以更简单,直接使用视图集。
    *直接举例说明:
    class PlatformViewSet(viewsets.ModelViewSet):

        """
        API endpoint that allows users to be viewed or edited.
        """
        queryset = PlatformInfo.objects.all()
        serializer_class = PlatformSerializers
    该类继承了viewsets.ModelViewSet,可通过源码发现,它具有增删查改的功能。
    我们通过Router约定进行注册,直接就可用。
    

你可能感兴趣的:(Django)