图
2个视图基类
APIView
rest_framework.views.APIView
APIView
是REST framework提供的所有视图的基类,继承自Django的View
父类。
APIView
与View
的不同之处在于:
- 传入到视图方法中的是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
- 提供list方法,快速实现列表视图
- 调用GenericAPIView设置好的结果集
- 调用GenericAPIView设置好的序列化器
2.CreateModelMixin
- 提供
create(request, *args, **kwargs)
方法快速实现创建资源的视图 - 实际创建功能由序列化的save方法完成
- save方法会去调用序列化器的create方法
3.RetrieveModelMixin
- 提供
retrieve(request, *args, **kwargs)
方法,可以快速实现返回一个存在的数据对象。
4.UpdateModelMixin
- 提供
update(request, *args, **kwargs)
方法,可以快速实现更新一个存在的数据对象。 - 内部更新功能调用序列化器的save方法
- save方法会调用序列化器的update方法
5.DestroyModelMixin
- 提供
destroy(request, *args, **kwargs)
方法,可以快速实现删除一个存在的数据对象。 - 内部模型对象的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,可以将一系列逻辑相关的动作放到一个类中:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
- 自定义视图方法
- 视图定义简单
- 路由简单
应用
- 针对一个资源,需要使用的操作比较多
- 操作数据库比较多
- 使用序列化器频繁
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。