DRF-Django rest framework
1. 视图
Django REST framwork 提供的视图的主要作用:
- 控制序列化器的执行(检验、保存、转换数据)
- 控制数据库查询的执行
2. 视图继承关系
3. 两个视图基类
# APIView
继承了原生Django的View
# GenericAPIView
继承了APIView
-queryset = models.Book.objects.all()
-serializer_class = serializer.BookModelSerializer
-get_queryset: 获取配置的queryset
-get_object: 路由中的分组字段必须是pk
-get_serializer:获取配置的序列化类
# 两个基类
APIView:如果跟models没有关系(没有数据库相关操作),就继承它
GenericAPIView:有关数据库操作,queryset 和serializer_class
1. APIView
from rest_framework.views import 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)
2. GenericAPIView
# 通用视图类
rest_framework.generics.GenericAPIView
继承自APIVIew
主要增加了操作序列化器和数据库查询的方法
作用是为下面Mixin扩展类的执行提供方法支持
通常在使用时,可搭配一个或多个Mixin扩展类
# 提供的关于序列化器使用的属性与方法
属性:
serializer_class 指明视图使用的序列化器
方法:
get_serializer_class(self)
当出现一个视图类中调用多个序列化器时
那么可以通过条件判断在get_serializer_class方法中
返回不同的序列化器类名就可以让视图方法执行不同的序列化器对象
返回序列化器类,默认返回serializer_class,可以重写,例如:
def get_serializer_class(self):
if self.request.user.is_staff:
return FullAccountSerializer
return BasicAccountSerializer
get_serializer(self, args, *kwargs)
返回序列化器对象,主要用来提供给Mixin扩展类使用
如果我们在视图中想要获取序列化器对象,也可以直接调用此方法
# 注意
该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据request、format、view
这三个数据对象可以在定义序列化器时使用
request 当前视图的请求对象
view 当前请求的类视图对象
format 当前请求期望返回的数据格式
# 提供的关于数据库查询的属性与方法
属性:
queryset 指明使用的数据查询集
方法:
get_queryset(self)
返回视图使用的查询集
主要用来提供给Mixin扩展类使用
是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:
def get_queryset(self):
user = self.request.user
return user.accounts.all()
get_object(self)
返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用
在视图中可以调用该方法获取详情信息的模型类对象
若详情访问的模型类对象不存在,会返回404
该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问
举例:
url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
class BookDetailView(GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request, pk):
# get_object()方法根据pk参数查找queryset中的数据对象
book = self.get_object()
serializer = self.get_serializer(book)
return Response(serializer.data)
# 其他可以设置的属性
pagination_class 指明分页控制类
filter_backends 指明过滤控制后端
# 代码
from rest_framework.generics import GenericAPIView
from students.models import Student
from .serializers import StudentModelSerializer, StudentModel2Serializer
from rest_framework.response import Response
class StudentsGenericAPIView(GenericAPIView):
# 本次视图类中要操作的数据[必填]
queryset = Student.objects.all()
# 本次视图类中要调用的默认序列化器[玄天]
serializer_class = StudentModelSerializer
def get(self, request):
"""获取所有学生信息"""
serializer = self.get_serializer(instance=self.get_queryset(), many=True)
return Response(serializer.data)
def post(self,request):
data = request.data
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
instance = serializer.save()
serializer = self.get_serializer(instance=instance)
return Response(serializer.data)
class StudentGenericAPIView(GenericAPIView):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
def get_serializer_class(self):
"""重写获取序列化器类的方法"""
if self.request.method == "GET":
return StudentModel2Serializer
else:
return StudentModelSerializer
# 在使用GenericAPIView视图获取或操作单个数据时,视图方法中的代表主键的参数最好是pk
def get(self,request,pk):
"""获取一条数据"""
serializer = self.get_serializer(instance=self.get_object())