Django详解之视图

一、继承apiview

# class BookDetailView(APIView):
# 
# 
#     def get(self, request):
#         # 获取全部
#         books = BookInfo.objects.all()
#         s = BookInfoSerializer(books, many=True)
#         return Response(s.data)
# 
# 
#     def get(self, request, pk):
#         # 获取单个
#         book = BookInfo.objects.get(id=pk)
#         s = BookInfoSerializer(book)
#         return Response(s.data)
#     
#     
#     def get(self, request):
#         # 创建一个对象()
#         date = {'btitle': "高数", 'bput_date': "2018-01-01"}
#         s = BookInfoSerializer(data=date)
#         s.is_valid(raise_exception=True)
#         s.save()
#         return Response(s.validated_data)
#     
#     
#     def get(self, request):
#         # 更新一个对象
#         data = {"btitle": "巴西柔术"}
#         book = BookInfo.objects.get(btitle='高数')
#         s = BookInfoSerializer(book, data=data, partial=True)
#         s.is_valid(raise_exception=True)
#         s.save()
#         return Response(s.validated_data)

二、继承GenericAPIView

# class BookDetailView(GenericAPIView):
#     queryset = BookInfo.objects.all()
#     serializer_class = BookInfoSerializer
# 
#     def get(self, request):
#         # 获取全部数据
#         books = self.get_queryset()
#         s = self.get_serializer(books, many=True)
#         return Response(s.data)
# 
#     def get(self, request, pk):
#         # 获取单一数据
#         book = self.get_object()
#         s = self.get_serializer(book)
#         return Response(s.data)
# 
#     def get(self, request):
#         # 增加一条数据
#         data = {'btitle': '泰拳', 'bput_date': '2018-01-01'}
#         s = self.get_serializer(data=data)
#         s.is_valid(raise_exception=True)
#         s.save()
#         return Response(s.validated_data)
# 
#     def get(self, request):
#         data = {'btitle': '桑巴'}
#         book = BookInfo.objects.get(btitle='泰拳')
#         s = self.get_serializer(book, data=data, partial=True)
#         s.is_valid(raise_exception=True)
#         s.save()
#         return Response(s.validated_data)

三、GenericAPIView五个拓展类使用

# class BookDetailView(CreateModelMixin,ListModelMixin,GenericAPIView):
#     # GenericAPIView拓展类查询列表和创建
#     queryset = BookInfo.objects.all()
#     serializer_class = BookInfoSerializer
#     def get(self,request):
#         return self.list(request)
#     def post(self,request):
#         return self.create(request)
# 
# class BookDetailView(DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin, GenericAPIView):
#     # GenericAPIView拓展类单个对象和修改数据(???????partial总是false),删除
#     queryset = BookInfo.objects.all()
#     serializer_class = BookInfoSerializer
# 
#     def get(self, request, pk):
#         return self.retrieve(request)
# 
#     def post(self, request, pk):
#         return self.update(request, content={"partial": True})
# 
#     def put(self, request, pk):
#         return self.destroy(request)

四、GenericAPIView和拓展类的9种组合类(写了4种)

class BookDetailView(CreateAPIView):
    # GenericAPIView拓展类查询列表和创建
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer


class BookDetailView(ListAPIView):
    # GenericAPIView拓展类查询列表和创建
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer


class BookDetailView(RetrieveAPIView):
    # GenericAPIView拓展类查询列表和创建
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer


class BookDetailView(DestroyAPIView):
    # GenericAPIView拓展类查询列表和创建
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

五、视图结果集ViewSet

路由:

url(r'(P<pk>.*)/$',views.BookDetailView.as_view({'get':'retrieve','put':'update','delete':'destory'})),
url(r'^',views.BookDetailView.as_view({'get':'list','post':'create'})),

视图:

class BookDetailView(ViewSet):
    def list(self, request):
        return HttpResponse('list')

    def retrieve(self, request, pk):
        return HttpResponse('retrieve')

    def create(self, request):
        return HttpResponse('create')

    def update(self, request, pk):
        return HttpResponse('update')

    def destory(self, request, pk):
        return HttpResponse('destory')

六、GenericViewSet配合5个拓展类用法:

路由和ViewSet一样

视图:

class BookDetailView(CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, ListModelMixin,
                     GenericViewSet):
    # GenericViewSet配合拓展类
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

七、ModelViewSet(GenericViewSet的拓展类,继承GnericViewSet和5个拓展类)

class BookInfoViewSet(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    @action(methods=['get'], detail=False)
    def latest(self, request):
        book = BookInfo.objects.latest('id')
        s = self.get_serializer(book)
        return Response(s.data)

猜你喜欢

转载自blog.csdn.net/weixin_42670402/article/details/85121249