DRF视图

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)

 

posted @ 2018-07-16 17:35  M瓶邪  阅读(81)  评论(0)    收藏  举报