drf 视图类
- Django REST framwork 提供的视图的主要作用?
- 控制序列化器的执行(检验,保存,转换数据)
- 控制数据库查询的执行
- REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写。
1. APIView
APIView
与View
的不同之处在于:
-
传入到视图方法中的是REST framework的
Request
对象,而不是Django的HttpRequeset
对象; -
视图方法可以返回REST framework的
Response
对象,视图会为响应数据设置(render)符合前端要求的格式; -
任何
APIException
异常都会被捕获到,并且处理成合适的响应信息; -
在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
支持定义的类属性
-
authentication_classes 列表或元祖,身份认证类
-
permissoin_classes 列表或元祖,权限检查类
-
throttle_classes 列表或元祖,流量控制类
在APIView
中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。
from django.shortcuts import render from django.views import View from rest_framework.views import APIView # Create your views here. from ser import models from req.serializers import StudentModelSerializer from rest_framework.response import Response from rest_framework import status class StudentsView(APIView): # 获取所有数据 def get(self,request): # http://127.0.0.1:8000/req/students/?a=1&b=2&b=3 b可能为多选数据 print(request.query_params) # -- request.GET <QueryDict: {'a': ['1'], 'b': ['2', '3']}> # print(request.GET) # print(request.query_params.getlist('b')) students = models.Student.objects.all() serializer_obj = StudentModelSerializer(instance=students,many=True) # return Response(serializer_obj.data,status=400) return Response(serializer_obj.data) # 添加单条记录 def post(self,request): serializer_obj = StudentModelSerializer(data=request.data) if serializer_obj.is_valid(): new_obj = models.Student.objects.create(**serializer_obj.validated_data) obj = StudentModelSerializer(instance=new_obj) return Response(obj.data, status=status.HTTP_201_CREATED) class StudentView(APIView): # 获取所有数据 def get(self, request, pk): student = models.Student.objects.get(pk=pk) serializer_obj = StudentModelSerializer(instance=student) return Response(serializer_obj.data) # 更新单条记录 def put(self,request,pk): student = models.Student.objects.get(pk=pk) data = request.data serializer_obj = StudentModelSerializer(instance=student,data=data,partial=True) if serializer_obj.is_valid(): instance = serializer_obj.save() new_serializer_obj = StudentModelSerializer(instance=instance) return Response(new_serializer_obj.data,status=status.HTTP_202_ACCEPTED) else: return Response({'error':"检验失败"}) # 删除单条记录 def delete(self, request, pk): models.Student.objects.get(pk=pk).delete() # return Response(None,) return Response('', status=status.HTTP_204_NO_CONTENT)
urls.py
from django.urls import path,re_path,include # re_path --- django1.11 url from req import views urlpatterns = [ path('students/', views.StudentsView.as_view()), re_path('students/(?P<pk>\d+)/', views.StudentView.as_view()), ]
继承自APIVIew
,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。
提供的关于序列化器使用的属性与方法
-
属性:
-
serializer_class 指明视图使用的序列化器
-
-
方法:
-
get_serializer_class(self)
当出现一个视图类中调用多个序列化器时,那么可以通过条件判断在get_serializer_class方法中通过返回不同的序列化器类名就可以让视图方法执行不同的序列化器对象了。
返回序列化器类,默认返回
serializer_class
,可以重写,例如:
-
# 当试图中使用多个序列化器类时,可以使用该方法来区分 def get_serializer_class(self): print('111111111111') if self.request.method == 'GET': return StudentModelSerializer2 else: return StudentModelSerializer
-
返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。
注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。
比如
serializer = self.get_serializer(instance=self.get_object(),context={'pk':pk})
,下面的request和view我们后面会用到,现在先了解一下,后面使用就知道了-
request 当前视图的请求对象
-
view 当前请求的类视图对象
-
format 当前请求期望返回的数据格式
-
提供的关于数据库查询的属性与方法
-
属性:
-
queryset 指明使用的数据查询集
-
-
方法:
-
get_queryset(self)
返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回
queryset
属性,可以重写,例如:
-