昨天写了post请求和get请求的接口,今天写剩下的。
GET
books-------->查看数据--------------------> 返回所有数据列表 :[{},{},{}]
POST
books-------->添加数据--------------------->返回添加数据 :{}
PUT
books/1------->更新pk=1的数据--------------->返回更新后的数据: {}
Delete
books/1-------> 删除pk=1的数据-------------->返回空
GET
books/1------->查看单条数据 --------------->返回查看的单条数据 {}
我们都看到剩下的put,delete,get的url中都需要传一个id参数,这必然不能再原来的视图中写,所以需要另写一个url和视图
对于一张表可以这样做,但是当有多个表的时候,我们就要写多个这样的代码,里面重复的代码会很多,我们想着能不能把这get,post,put,delete,get这五个请求方式写成五个类,然后Bookview和SBookview分别继承自己相应的请求方式类,
举一个简单例子来说一下:
这就是rest_framework的视图类了。
其实这些类不用我们写,因为rest_framework 已经帮我们做好了。来看代码:
from rest_framework import generics from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin class PublishView(ListModelMixin,CreateModelMixin,generics.GenericAPIView): queryset = Publish.objects.all() #获取所有publish serializer_class = PublishSerializer # 序列化 def get(self,request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self,request, *args, **kwargs): return self.create(request, *args, **kwargs) class SPublishView(UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin,generics.GenericAPIView): queryset = Publish.objects.all() serializer_class = PublishSerializer def put(self,request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self,request, *args, **kwargs): return self.destroy(request, *args, **kwargs) def get(self,request, *args, **kwargs): return self.retrieve(request, *args, **kwargs)
这样写好之后,在url要写上命名分组:
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
其实我们点进 ListModelMixin 的源码可以看见:里面写的方法和我们之前处理请求的方法差不多是一样的,所以同理在其他的类中都会有相应的方法去处理相应的请求。
这样写已经很简便了,但是这样写仍然有重复的代码,那些处理请求的代码都是一样的,所以还是能够简便的
同样url要分组命名:
但这并不是最终的版本,因为我们对一个model写了两个视图,这固然不好。
这样写了之后,url中需要传个参数:
我们来解读一下这个终极版本的源码:
先从AuthorView中找as_view,如果找不到,就从他的父类ModelViewSet中寻找,
如果还没有,就一层一层往上找,最终找到了ViewSetMixin,
我们知道as_view方法最终返回的是view,
在view方法中,
然后返回self.dispatch,然后从APIView中找dispatch方法:
在dispatch方法中做相应请求方式的分发。
一旦用户访问,get访问authors/:
ViewSetMixin.view(reqeust):
for method, action in actions.items(): # {"get":"list","post":"create"}
handler = getattr(self, action) # handler===self.list
setattr(self, method, handler) # self.get=self.list
return self.dispatch(request, *args, **kwargs)
APIView.dispatch(request):
handler = getattr(self, request.method.lower()) # self.get = self.list
response = handler(request, *args, **kwargs)
# def list(self.request):
` # return Response(serializer.data)
return response