本文是对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约定进行注册,直接就可用。