前端之家收集整理的这篇文章主要介绍了
DRF 视图和路由,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Django Rest Feamework 视图和路由
DRF的视图
APIView
我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个有什么不同呢
urlpatterns =\d+)$
我们可以看到,不管是View还是APIView最开始调用的都是as_view()方法~~那我们走进源码看看~~

我们能看到,APIView继承了View,并且执行了View中的as_view()方法,最后把view返回了,用csrf_exempt()方法包裹后去掉了csrf的认证。
那我们看看View中的as_view()方法做了什么~
502ad9cc2a606590f.png" alt="">
我们看到了~在View中的as_view方法返回了view函数,而view函数执行了self.dispatch()方法~~但是这里的dispatch方法应该是我们APIView中的~~

我们去initialize_request中看下把什么赋值给了request,并且赋值给了self.request,也就是我们在视图中用的request.xxx到底是什么~~

我们看到,这个方法返回的是Request这个类的实例对象~~我们注意我们看下这个Request类中的第一个参数request,是我们走我们django的时候的原来的request~

我们看到了,这个Request类把原来的request赋值给了self._request,也就是说以后_request是我们老的request,新的request是我们这个Request类~~
那我们继承APIView之后请求来的数据都在哪呢~~

我们用了rest_framework框架以后,我们的request是重新封装的Request类~
request.query_params 存放的是我们get请求的参数
request.data 存放的是我们所有的数据,包括post请求的以及put,patch请求~~~
相比原来的django的request,我们现在的request更加精简,清晰了~~~
现在我们知道了APIView和View的一些区别~~当然还有~~后面我们还会说~~
我们写的视图可能对多个表进行增删改查,就导致我们的视图特别多重复的代码~~
那么我们尝试着来进行封装一下~~
第一次封装
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request):
query_set </span>=<span style="color: #000000;"> Book.objects.all()
book_ser </span>= BookSerializer(query_set,many=<span style="color: #000000;">True)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(book_ser.data)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> post(self,request):
query_set </span>=<span style="color: #000000;"> request.data
book_ser </span>= BookSerializer(data=<span style="color: #000000;">query_set)
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> book_ser.is_valid():
book_ser.save()
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(book_ser.validated_data)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(book_ser.errors)
<span style="color: #0000ff;">class<span style="color: #000000;"> BookEditView(APIView):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,id):
query_set </span>= Book.objects.filter(id=<span style="color: #000000;">id).first()
book_ser </span>=<span style="color: #000000;"> BookSerializer(query_set)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(book_ser.data)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> patch(self,id):
query_set </span>= Book.objects.filter(id=<span style="color: #000000;">id).first()
book_ser </span>= BookSerializer(query_set,data=request.data,partial=<span style="color: #000000;">True)
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> book_ser.is_valid():
book_ser.save()
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(book_ser.validated_data)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(book_ser.errors)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> delete(self,id):
query_set </span>= Book.objects.filter(id=<span style="color: #000000;">id).first()
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> query_set:
query_set.delete()
</span><span style="color: #0000ff;">return</span> Response(<span style="color: #800000;">""</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span> Response(<span style="color: #800000;">"</span><span style="color: #800000;"><a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>的书籍不存在</span><span style="color: #800000;">"</span>)</pre>
==</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_queryset(self):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.queryset.all()
</span><span style="color: #0000ff;">def</span> get_serializer(self,*args,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">return</span> self.serializer_class(*args,**<span style="color: #000000;">kwargs)
<span style="color: #0000ff;">class<span style="color: #000000;"> ListModelMixin(object):
<span style="color: #0000ff;">def list(self,**<span style="color: #000000;">kwargs):
queryset =<span style="color: #000000;"> self.get_queryset()
serializer = self.get_serializer(queryset,many=<span style="color: #000000;">True)
<span style="color: #0000ff;">return<span style="color: #000000;"> Response(serializer.data)
<span style="color: #0000ff;">class<span style="color: #000000;"> CreateModelMixin(object):
<span style="color: #0000ff;">def create(self,**<span style="color: #000000;">kwargs):
serializer = self.get_serializer(data=<span style="color: #000000;">request.data)
<span style="color: #0000ff;">if<span style="color: #000000;"> serializer.is_valid():
serializer.save()
<span style="color: #0000ff;">return<span style="color: #000000;"> Response(serializer.validated_data)
<span style="color: #0000ff;">else<span style="color: #000000;">:
<span style="color: #0000ff;">return<span style="color: #000000;"> Response(serializer.errors)
<span style="color: #0000ff;">class<span style="color: #000000;"> RetrieveModelMixin(object):
<span style="color: #0000ff;">def retrieve(self,id,**<span style="color: #000000;">kwargs):
book_obj = self.get_queryset().filter(pk=<span style="color: #000000;">id).first()
book_ser =<span style="color: #000000;"> self.get_serializer(book_obj)
<span style="color: #0000ff;">return<span style="color: #000000;"> Response(book_ser.data)
<span style="color: #0000ff;">class<span style="color: #000000;"> UpdateModelMixin(object):
<span style="color: #0000ff;">def update(self,**<span style="color: #000000;">kwargs):
book_obj = self.get_queryset().filter(pk=<span style="color: #000000;">id).first()
book_ser = self.get_serializer(book_obj,partial=<span style="color: #000000;">True)
<span style="color: #0000ff;">if<span style="color: #000000;"> book_ser.is_valid():
book_ser.save()
<span style="color: #0000ff;">return<span style="color: #000000;"> Response(book_ser.validated_data)
<span style="color: #0000ff;">else<span style="color: #000000;">:
<span style="color: #0000ff;">return<span style="color: #000000;"> Response(book_ser.errors)
<span style="color: #0000ff;">class<span style="color: #000000;"> DestroyModelMixin(object):
<span style="color: #0000ff;">def destroy(self,**<span style="color: #000000;">kwargs):
queryset =<span style="color: #000000;"> self.get_queryset()
<span style="color: #0000ff;">try<span style="color: #000000;">:
queryset.get(pk=<span style="color: #000000;">id).delete()
<span style="color: #0000ff;">return Response(<span style="color: #800000;">""<span style="color: #000000;">)
<span style="color: #0000ff;">except<span style="color: #000000;"> Exception as e:
<span style="color: #0000ff;">return Response(<span style="color: #800000;">"<span style="color: #800000;">信息有误<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> 我们把公共的部分抽出来 这样不管写多少表的增删改查都变的很简单<span style="color: #008000;">
<span style="color: #008000;"> 这样封装后我们的视图会变成这样
<span style="color: #0000ff;">class<span style="color: #000000;"> BookView(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset =<span style="color: #000000;"> Book.objects.all()
serializer_class =<span style="color: #000000;"> BookSerializer
</span><span style="color: #0000ff;">def</span> get(self,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">return</span> self.list(request,**<span style="color: #000000;">kwargs)
</span><span style="color: #0000ff;">def</span> post(self,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">return</span> self.create(request,**<span style="color: #000000;">kwargs)
<span style="color: #0000ff;">class<span style="color: #000000;"> BookEditView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset =<span style="color: #000000;"> Book.objects.all()
serializer_class =<span style="color: #000000;"> BookSerializer
</span><span style="color: #0000ff;">def</span> get(self,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">return</span> self.retrieve(request,**<span style="color: #000000;">kwargs)
</span><span style="color: #0000ff;">def</span> patch(self,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">return</span> self.update(request,**<span style="color: #000000;">kwargs)
</span><span style="color: #0000ff;">def</span> destroy(self,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">return</span> self.delete(request,**kwargs)</pre>