from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView, ListAPIView
from rest_framework import mixins
from rest_framework.viewsets import ViewSet,GenericViewSet,ReadOnlyModelViewSet
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser, IsAuthenticatedOrReadOnly, BasePermission
from .models import BookInfo
from .serializers import BookInfoSerializer
# Create your views here.
# ReadOnlyModelViewSet == mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet
# class BookInfoReadOnlyViewSet(ReadOnlyModelViewSet):
# # 指定序列化器
# serializer_class = BookInfoSerializer
# # 指定查询集
# queryset = BookInfo.objects.all()
# pass
class MyPermission(BasePermission):
def has_object_permission(self, request, view, obj):
"""控制对obj对象的访问权限,此案例决绝所有对对象的访问
不能访问单一结果,但是可以访问列表结果
"""
return False
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
"""使用GenericViewSet实现返回列表和单一值"""
# 指定序列化器
serializer_class = BookInfoSerializer
# 指定查询集
queryset = BookInfo.objects.all()
# 指定接口的权限:验证的程度, 是允许所有用户访问,还是普通登录用户可以访问,还是管理员可以访问,。。。
permission_classes = [IsAuthenticated, MyPermission]
# detail为False 表示路径名格式应该为 books/latest/
@action(methods=['get'], detail=False)
def latest(self, request):
"""
追加action:返回书籍倒叙后的第0个的图书信息
GET /books/latest/
"""
book = BookInfo.objects.latest('id')
serializer = self.get_serializer(book)
return Response(serializer.data)
# detail为True,表示路径名格式应该为 books/<pk>/read/
# detail为True 在注册路由时,会自动的给路由的前缀的后面补充<pk>
@action(methods=['put'], detail=True)
def read(self, request, pk):
"""
追加action:修改图书的阅读量数据
PUT /books/<pk>/read/
"""
book = self.get_object()
book.bread = request.data.get('read')
book.save()
serializer = self.get_serializer(book)
return Response(serializer.data)
# class BookInfoViewSet(GenericViewSet):
# def list(self):
# pass
#
# def retrieve(self):
# pass
# class BookInfoViewSet(ViewSet):
# def list(self):
# pass
#
# def retrieve(self):
# pass
# class BookListView(ListAPIView):
# """使用ListAPIView实现“获取所有图书信息”接口"""
# # 指定序列化器类
# serializer_class = BookInfoSerializer
# # 指定查询集
# queryset = BookInfo.objects.all()
# class BookDetailView(mixins.RetrieveModelMixin, GenericAPIView):
# """使用GenericAPIView实现“获取单一图书信息”接口"""
#
# # 指定序列化器类
# serializer_class = BookInfoSerializer
# # 指定查询集
# queryset = BookInfo.objects.all()
#
# def get(self, request, pk):
# return self.retrieve(request)
# class BookListView(mixins.ListModelMixin, GenericAPIView):
# """使用GenericAPIView实现“获取所有图书信息”接口"""
#
# # 指定序列化器类
# serializer_class = BookInfoSerializer
# # 指定查询集
# queryset = BookInfo.objects.all()
#
# def get(self, request):
# return self.list(request)
# class BookDetailView(GenericAPIView):
# """使用GenericAPIView实现“获取单一图书信息”接口"""
#
# # 指定序列化器类
# serializer_class = BookInfoSerializer
# # 指定查询集
# queryset = BookInfo.objects.all()
#
# def get(self, request, pk):
# """
# 获取单一图书信息
# GET /books/<pk>/
# :param request: Request类型的对象
# :param pk: 要操作的数据的主键
# :return: JSON
# """
# # get_object:会自动的拿着lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field去查询指定的单一值
# # lookup_url_kwarg = pk
# book = self.get_object()
# # 创建序列化器
# serializer = self.get_serializer(book)
#
# # 响应json数据
# return Response(serializer.data)
# class BookListView(GenericAPIView):
# """使用GenericAPIView实现“获取所有图书信息”接口
# DRF的使用的原则:思考使用哪个序列化器序列化和反序列化哪些数据
# """
#
# # 指定序列化器类
# serializer_class = BookInfoSerializer
# # 指定查询集
# queryset = BookInfo.objects.all()
#
# def get(self, reqeust):
# """
# 提供所有图书信息
# GET /books/
# :param request: Request类型的对象
# :return: JSON
# """
# # 获取真实的查询集
# qs = self.get_queryset()
# # 创建序列化器
# serializer = self.get_serializer(qs, many=True)
#
# # 响应json数据
# return Response(serializer.data)
# url(r'^books/$', views.BookListView.as_view()),
# class BookListView(APIView):
# """使用APIView实现“获取所有图书信息”接口"""
#
# def get(self, request):
# """
# 提供所有图书信息
# GET /books/
# :param request: Request类型的对象
# :return: JSON
# """
# # 获取图书信息的查询集
# qs = BookInfo.objects.all()
#
# # 序列化模型数据做输出,要序列化多个
# serializer = BookInfoSerializer(qs, many=True)
#
# # 响应json数据
# return Response(serializer.data)