1.介绍
该篇博客主要介绍restframework内置的Request类,它扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。
如: 在APIView中封装的request,就实现了请求数据的解析:对于GET请求的参数我们通过request.query_params来获取。对于POST请求、PUT请求的数据我们通过request.data来获取。
1.1 基于APIView的请求
在上一篇中,我们获取请求的方式:
urls.py
url(r'comment/',views.CommentView.as_view()), url(r'comment/(?P<pk>d+)/$',views.CommentDetail.as_view()),
views.py
from app01 import models from app01 import app01_serializers # 导入验证表 from rest_framework.views import APIView # 你打开源码,在rest_framework文件夹下还有一个一个views文件,里面有APIView类,它继承了view from rest_framework.response import Response class Comment(APIView): def get(self, request, *args, **kwargs): query_set = models.School.objects.all() ser_obj = app01_serializers.CommentSerializer(query_set, many=True) return Response(ser_obj.data) class CommentDetail(APIView): def get(self, request, pk, *args, **kwargs): obj = models.School.objects.filter(pk=pk).first() ser_obj = app01_serializers.CommentSerializer(obj) return Response(ser_obj.data)
app01_serializers.py(在我们应用下创建的文件)
from app01.models import Comment from rest_framework import serializers class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment fields = "__all__" depth = 1
1.2 基于GenericAPIView的请求
GenericAPIView对APIView再次封装,实现了强大功能。通常使用时,可搭配一个或多个Mixin扩展类:
1.ListModelMixin # 提供list方法快速实现列表视图(多条数据) 2.CreateModelMixin # 提供create方法快速实现创建资源的视图 3.RetrieveModelMixin # 提供retrieve方法,可以快速实现返回一个存在的数据对象(需要传入pk) 4.UpdateModelMixin # 提供update方法,可以快速实现更新一个存在的数据对象。 提供partial_update方法,可以实现局部更新 5.DestroyModelMixin # 提供destroy方法,可以快速实现删除一个存在的数据对象
这五个类分别实现了增删改查的功能,其中ListModelMixin实现的request方法无需传入id值,就可以查找全部数据,而RetrieveModelMixin需要传入id才能实现查找,而且是针对性的
GenericAPIView属性:
支持定义的属性: 列表视图与详情视图通用: queryset # 列表视图的查询集 serializer_class # 视图使用的序列化器 列表视图使用: pagination_class # 分页控制类 filter_backends # 过滤控制后端 详情页视图使用: lookup_field # 查询单一数据库对象时使用的条件字段,默认为'pk' lookup_url_kwarg # 查询单一数据时URL中的参数关键字名称,默认与look_field相同
详细介绍猛戳这里
urls.py(这里的路由规定必须以“/”结尾,注意后面的路由写入)
url(r'comment/(?P<pk>d+)/$',views.CommentDetail.as_view()), url(r'comment/',views.CommentView.as_view()),
app01_serializers.py(在我们应用下创建的文件)
from app01.models import Comment from rest_framework import serializers class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment fields = "__all__" depth = 1
views.py(这是针对get请求操作)
from app01 import models from app01 import app01_serializers # 导入验证表 from rest_framework.mixins import ListModelMixin,RetrieveModelMixin from rest_framework.generics import GenericAPIView class CommentView(GenericAPIView,ListModelMixin): # 这里必须要叫做queryset和serializer_class,这两个是在GenericAPIView # 的源码里面定义的变量 queryset = models.Comment.objects.all() serializer_class = app01_serializers.CommentSerializer def get(self,request,*args,**kwargs): return self.list(request,*args,**kwargs) # 查看指定字段 class CommentDetail(GenericAPIView,RetrieveModelMixin): queryset = models.Comment.objects.all() serializer_class = app01_serializers.CommentSerializer def get(self,request, pk,*args,**kwargs): return self.retrieve(request, pk, *args, **kwargs)
针对post请求操作(这里和上面操作一致,不过要注意app01_serializers.py下的depth=1一定要注掉,否则会提示出错)
class CommentView(GenericAPIView, CreateModelMixin): queryset = models.Comment.objects.all() serializer_class = app01_serializers.CommentSerializer def post(self,request, *args, **kwargs): return self.create(request, *args, **kwargs)
效果:
针对update和delete请求操作(这两个要使用到id,所以必须传入RetrieveModelMixin)
class CommentDetail(GenericAPIView, RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin): queryset = models.Comment.objects.all() serializer_class = app01_serializers.CommentSerializer # 更改操作 def put(self,request,pk): return self.update(request,pk,) # 删除操作 def delete(self,request,pk,*args, **kwargs): return self.destroy(request, pk, *args, **kwargs) # 这步其实在最后调用了上面的delete操作,做权限认证删除使用(看源码) def perform_destroy(self, instance): print("你要删除了...") instance.delete()
效果:
1.3 基于GenericAPIView下的RetrieveUpdateDestroyAPIView类实现的请求
RetrieveUpdateDestroyAPIView类继承了
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView
这几个类,它拥有get,put,patch和delete方法
1..4 基于ModelViewSet下的请求
ModelViewSet视图集会自动提供list,create,retrieve,update&destroy这些行为
查看源码,它包含6个功能:
用法:
urls.py(这里书写还是很麻烦的,下面会在介绍一种简单的url版本)
url(r'comment/$', views.CommentViewSet.as_view({ "get": "list", "post": "create", })), url(r'comment/(?P<pk>d+)/$', views.CommentViewSet.as_view({ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' })),
urls.py(把上面的注掉,我们可以使用restframework自带的类来重写url)
from rest_framework.routers import DefaultRouter router = DefaultRouter() # 注册路由,表示路径comment对应视图函数CommentViewSet router.register(r'comment', views.CommentViewSet) urlpatterns += router.urls
app01_serializers.py(在我们应用下创建的文件)
from app01.models import Comment from rest_framework import serializers class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment fields = "__all__"
views.py
# 导入该模块 from rest_framework.viewsets import ModelViewSet class CommentViewSet(ModelViewSet): queryset = models.Comment.objects.all() serializer_class = app01_serializers.CommentSerializer
以上也实现了增删改查的效果,而且书写代码量明显减少了,它当中的继承关系如下图所示: