Django restframework中的view

View相关类继承关系图

相比较与函数,基于类的视图有一些区别和优势:

1.组织与特定HTTP方法相关的代码(GET,POST等) 可以通过单独的方法而不是条件分支来解决。

2.面向对象的技术例如Mixin(多继承、混用)可以将代码分解成可重用的组件。

1.View

视图类view的基本使用时django入门必备,在我的另一篇博文中有写到:https://blog.csdn.net/qq_37674086/article/details/109113480

 

2.APIView

APIView是drf中所有view的父类,本身继承于Django的VIew,只有简单的调度方法和健壮检查。

和View的不同

1.请求和返回使用的drf的Request Response而不是django的HttpRequest HttpResponse。

2.请求传入时进行身份验证,并在传给处理方法前进行权限检验。

3.任何APIException都会被捕捉并放入合适的想要中。

APIView的使用与django自带的view类似,接收的请求会被dispatch到对应的方法中,如get()post()……此外,还可以设置许多属性来控制API各个方面的策略。

from rest_framework.views import APIView
from rest_framework.authentication import TokenAuthentication
from rest_framework import permissions


class Temps(APIView):
    
    authentication_classes = (TokenAuthentication,)  #身份验证类
    permission_classes = 
 (permissions.IsAuthenticatedOrReadOnly,permissions.IsAuthenticated,permissions.IsAdminUser)    #权限验证类
    

    # 处理GET请求
    def get(self, request, format=None):
        name = request.GET.get('name',None)
        temp = Temp.objects.all()
        serializer = TempSerializer(temp, many=True)
        return Response(serializer.data)

    # 处理POST请求
    def post(self, request, format=None):
        data=request.data
        serializer = TempSerializer(data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, format=None):
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
 
    def put(self, request, format=None):
        pass
        

 

3.GenericAPIView

from rest_framework import generics.GenericAPIView

通常GenericAPIView不会单独使用,因为它相比APIView,仅仅提供了一些公共的用于列表视图和详情视图的属性和方法,基本的从接收前端数据到数据库操作(增删改查)还是要自己定义,相对apiview没有省多少工作量。

GenericAPIView需要和Mixins组合使用。

 

常用属性与方法

.queryset

指定要显示的Model对象的QuerySet对象(查询集),用于列表视图中。在GenericAPIView中必须指定该属性或者重写get_queryset()方法。

.serializer_class

指定要显示的Model对象的Serializer对象,在GenericAPIView中必须指定该属性或者重写get_serializer()方法。

.lookup_field

指定用于查找单个Model实例的Model字段,默认为pk.

.lookup_url_kwarg

指定用于Model查找的url关键字参数,如果未设置,则默认使用与lookup_field的值。

.pagination_class

指定列表视图中用于分页的分页类列表,可以对响应列表进行分页。默认使用配置文件中DEFAULT_PAGINATION_CLASS的值。

.filter_backends

指定用于过滤查询集的过滤器后端类列表。 默认使用为DEFAULT_FILTER_BACKENDS设置的值。

.get_queryset(self)

返回用于列表视图的查询集,默认返回queryset属性指定的查询集。

NOTE:
应始终使用此方法而不是直接访问self.queryset,因为self.queryset仅被评估一次,然后将结果进行缓存用于所有后续请求。

.get_object(self)

返回用于详情视图中的Model对象实例,默认使用lookup_field字段过滤QuerySet中的数据。

.get_serializer()

返回用于Model序列化的Serializer类,默认返回serializer_class属性的值,该方法可以用来动态指定一个序列化类。

 

4.Mixin

from rest_framework import mixins

mixins.ListModelMixin,

mixins.RetrieveModelMixin,

mixins.UpdateModelMixin,

mixins.DestroyModelMixin,

mixins.CreateModelMixin

4.1.ListModelMixin

请求方法:get  /api/

该类提供了一个.list(request, *args, **kwargs)方法,用于列出查询集QuerySet。如果queryset被填充,则响应码为200,并将查询集序列化作为响应体响应给客户端。

4.2.CreateModelMixin

请求方法:post  /api/

该类提供一个.create(request, *args, **kwargs)方法,用于创建并保存一个新的Model实例,因此用在POST请求中,和post()方法组合使用。如果Model实例创建成功,则响应码为201 Created ,并将对象序列化后作为响应体响应给客户端;如果Model实例创建失败,则响应码为401(Bad Request),并将错误信息作为响应体。

4.3.RetrieveModelMixin

请求方法:get  /api/{id}/

该类提供一个retrieve(request, *args, **kwargs)方法,用于检索并返回一个现有的Model实例。如果能够检索到对象,则返回200 OK响应,并将对象序列化后作为响应体输出,否则返回404 Not Found响应。

4.4.UpdateModelMixin

请求方法:put  /api/{id}/

该类提供一个update(request, *args, **kwargs)方法,用于更新并保存现有的Model对象。因此用在PUT请求中,和put()方法组合使用。如果更新成功,则返回200 OK响应,并将对象序列化后作为响应体输出,否则返回400 Bad Request响应。

4.5.DestroyModelMixin

请求方法:delete  /api/{id}/

该类提供一个.destroy(request, *args, **kwargs)方法,用于删除一个已存在的Model实例。如果删除成功返回204 No Content响应,否则返回404 Not Found响应。

 

ModelViewSet

通常结合rest_framework.serializers.ModelSerializer,model使用

源码

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass

使用

from rest_framework import viewsets

class AutherModelCBV(viewsets.ModelViewSet):
    queryset = models.Auther.objects.all()
    serializer_class = authermodelserializer
    
    def list(self, request, *args, **kwargs):
        return Response(..)

由于modelviewset也集成了mix相关类所以有get,post,delete, put相关对应的方法

请求 url对应方法备注
get127.0.0.1:8000/projects/ listListModelMixin
get127.0.0.1:8000/projects/{1}/retrieve....Mixin
post127.0.0.1:8000/projects/ create....Mixin
put127.0.0.1:8000/projects/{1}/update....Mixin
detete127.0.0.1:8000/projects/{1}/destroy....Mixin
get127.0.0.1:8000/projects/ useractionuseraction自定义
post127.0.0.1:8000/projects/ useractionuseraction自定义

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值