Restframework中的Request

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  

以上也实现了增删改查的效果,而且书写代码量明显减少了,它当中的继承关系如下图所示:

  

 

转载于:https://www.cnblogs.com/LearningOnline/p/9410677.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值