APIView
from rest_framework.views import APIView
from rest_framework.response import Response
from booktest.models import BookInfo
from booktest.serializers import BookInfoSerializer
class BookInfoAPIView(APIView):
"""使用APIView基类实现获取所有图书信息的接口"""
def get(self,request):
books = BookInfo.objects.all() #获取查询集
s = BookInfoSerializer(books,many=True) # 创建序列化器
return Response(s.data) # 返回JSon格式数据
url(r'^books/$',new_views.BookinfoAPIView.as_view()),
在浏览器输入127.0.0.1:8000/books/ 得到的结果:
APIView
与View
的不同之处在于:
- 传入到视图方法中的是REST framework的
Request
对象,而不是Django的HttpRequeset
对象; - 视图方法可以返回REST framework的
Response
对象,视图会为响应数据设置(render)符合前端要求的格式; - 任何
APIException
异常都会被捕获到,并且处理成合适的响应信息; - 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
支持定义的属性:
- authentication_classes 列表或元祖,身份认证类
- permissoin_classes 列表或元祖,权限检查类
- throttle_classes 列表或元祖,流量控制类
GenericAPIView提供的关于数据库查询的属性与方法
from rest_framework.generics import GenericAPIView
class BookInfoGenericAPIView(GenericAPIView):
"""使用GenericAPIView基类实现获取所有图书信息的接口
继承自APIVIew,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。"""
# 指定反序列化器
s = BookInfoSerializer
# 指定查询集
queryset = BookInfo.objects.all()
def get(self, request):
# 获取真实的查询集
qs = self.get_queryset()
# 创建真实的查询集
s = self.get_serializer(qs,many=True)
return Response(s.data) # 返回JSon格式数据
执行结果和上面相同
GenericAPIView实现查询单一数据信息
class BookDetailView(GenericAPIView):
"""使用GenericAPIView基类实现查询单一的数据信息的接口"""
# 指定反序列化器类
serializer_class = BookInfoSerializer
# 指定查询集 queryset负责接受查询集 get_queryset是
queryset = BookInfo.objects.all()
def get(self,request,pk):
"""
获取单一数据的信息
:param request: Request类型的对象
:param pk: 查询的单一数据的主键
:return: Json格式数据
"""
# 获取单一数据的主键
# 会自动的拿着lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field查询制定的单一值
book = self.get_object()
# 创建序列化器
s = self.get_serializer(book)
return Response(s.data) # 返回JSon格式数据
- serializer_class 指明视图使用的序列化器
- get_serializer_class(self) 返回序列化器类,默认返回
serializer_class
,可以重写 -
get_serializer(self, args, *kwargs) 返回序列化器对象,主要用来提供给Mixin扩展类使用
注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。
-
request 当前视图的请求对象
-
view 当前请求的类视图对象
-
format 当前请求期望返回的数据格式
关于数据库查询的属性和方法
- queryset 指明使用的数据查询集
-
get_queryset(self)
返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回
queryset
属性,可以重写 -
get_object(self)
返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用
- pagination_class 指明分页控制类
- filter_backends 指明过滤控制后端