其他分享
首页 > 其他分享> > 1-5.视图组件

1-5.视图组件

作者:互联网

目录

2个视图基类

APIView

rest_framework.views.APIView

APIView是REST framework提供的所有视图的基类,继承自Django的View父类。

APIViewView的不同之处在于:

- 传入到视图方法中的是REST framework的`Request`对象,而不是Django的`HttpRequeset`对象;
- 视图方法可以返回REST framework的`Response`对象,视图会为响应数据设置(render)符合前端要求的格式;
- 任何`APIException`异常都会被捕获到,并且处理成合适的响应信息;
- 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

支持定义的类属性

authentication_classes	  列表或元祖,身份认证类
permissoin_classes		  列表或元祖,权限检查类
throttle_classes		  列表或元祖,流量控制类

APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。

例:

from rest_framework.views import APIView
from rest_framework.response import Response

# url(r'^students/$', views.StudentsAPIView.as_view()),
class StudentsAPIView(APIView):
  	
    def get(self, request):
        data_list = Student.objects.all()
        serializer = StudentModelSerializer(instance=data_list, many=True)
        return Response(serializer.data)

GenericAPIView通用视图类

继承自APIVIew主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。

-queryset = None  # 所有数据
-serializer_class = None # 序列化的类
-lookup_field = 'pk'  # 查询单条转换器的字段
# 三个方法
self.get_queryset()   # 获取所有数据
self.get_serializer()   # 获取序列化类
self.get_object()    # 获取单条

属性:

serializer_class 指明视图使用的序列化器

queryset 指明使用的数据查询集

lookup_field = 'pk' # 查询单条转换器的字段

方法:

**get_serializer(self, *args, kwargs)

返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。

注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

- **request** 当前视图的请求对象
- **view** 当前请求的类视图对象
- format 当前请求期望返回的数据格式
get_queryset(self)

返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回queryset属性

get_object(self)

返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。

在试图中可以调用该方法获取详情信息的模型类对象。

若详情访问的模型类对象不存在,会返回404。

通过继承GenericAPIView 写5个接口

##### 通过继承GenericAPIView 写5个接口
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView  # 继承APIView,写了几个类属性


from rest_framework.mixins import RetrieveModelMixin,ListModelMixin,CreateModelMixin
class PublishView(GenericAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer


    def get(self, request):
        obj = self.get_queryset()
        ser = self.get_serializer(instance=obj, many=True)
        return Response(data=ser.data)

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)
        # ser.is_valid(raise_exception=True)


class PublishDetailView(GenericAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer
    def get(self, request, pk):
        obj = self.get_object()  # 获取单条,根据pk
        ser = PublishSerializer(instance=obj)
        return Response(data=ser.data)

    def put(self, request, pk):
        obj = self.get_object()  # 数据不存在,None,如果instance是None,ser.save-->新增

        ser = self.get_serializer(data=request.data, instance=obj)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)

    def delete(self, request, pk):
        res = self.get_object().delete()  # 返回影响的行数的元组
        print(res)  #
        if res[0] >= 1:
            return Response()
        else:
            return Response('要删除的数据不存在')

5个视图扩展类

作用:

提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。

这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。

1.ListModelMixin

  1. 提供list方法,快速实现列表视图
  2. 调用GenericAPIView设置好的结果集
  3. 调用GenericAPIView设置好的序列化器

2.CreateModelMixin

  1. 提供create(request, *args, **kwargs)方法快速实现创建资源的视图
  2. 实际创建功能由序列化的save方法完成
  3. save方法会去调用序列化器的create方法

3.RetrieveModelMixin

  1. 提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。

4.UpdateModelMixin

  1. 提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。
  2. 内部更新功能调用序列化器的save方法
  3. save方法会调用序列化器的update方法

5.DestroyModelMixin

  1. 提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。
  2. 内部模型对象的delete方法

9个视图子类

ListAPIView

继承

ListModelMixin,
GenericAPIView

方法

get

CreateAPIView

继承

CreateModelMixin,
GenericAPIView

方法

post

ListCreateAPIView

继承

ListModelMixin,
CreateModelMixin,
GenericAPIView

方法

get
post

RetrieveAPIView

继承

RetrieveModelMixin,
GenericAPIView

方法

get

UpdateAPIView

继承

UpdateModelMixin,
GenericAPIView

方法

put

DestroyAPIView

继承

DestroyModelMixin,
GenericAPIView

方法

delete

RetrieveUpdateAPIView

继承

RetrieveModelMixin,
UpdateModelMixin,
GenericAPIView

方法

get
put

RetrieveDestroyAPIView

继承

RetrieveModelMixin,
DestroyModelMixin,
GenericAPIView

方法

get
delete

RetrieveUpdateDestroyAPIView

继承

RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin,
GenericAPIView

方法

get
put
delete

视图集

特点

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  1. list() 提供一组数据
  2. retrieve() 提供单个数据
  3. create() 创建数据
  4. update() 保存数据
  5. destory() 删除数据
  6. 自定义视图方法
  7. 视图定义简单
  8. 路由简单

应用

  1. 针对一个资源,需要使用的操作比较多
  2. 操作数据库比较多
  3. 使用序列化器频繁

1) ViewSet

继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

2)GenericViewSet

继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。

3)ModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4)ReadOnlyModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。

标签:GenericAPIView,ser,get,self,视图,组件,序列化
来源: https://www.cnblogs.com/hhf1751342707/p/15736119.html