rest_framework学习(三)视图函数的介绍

视图函数

方式一

urls.py

from django.urls import path, re_path

urlpatterns = [
    path('books/', BooksView.as_view(), name='Books'),
    re_path('^books/(?P<pk>\d+)/$', BooksDetailView.as_view(), name="BooksDetail"),
]

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
class BooksView(APIView):
    def get(self, request):
        book_list = Books.objects.all()
        ret = BookModelSerializer(book_list, many=True, context={"request": request})
        return Response(ret.data)

    def post(self, request):
        bs = BookModelSerializer(data=request.data)
        if bs.is_valid():
            bs.save()
            return Response(bs.data)

        else:
            return Response(bs.errors)


class BooksDetailView(APIView):
    def get(self, request, id):
        ret = BookModelSerializer(Books.objects.filter(id=id).first())
        return Response(ret.data)

    def put(self, request, id):
        book = Books.objects.filter(id=id).first()
        bs = BookModelSerializer(instance=book, data=request.data)
        if bs.is_valid():
            bs.save()
            return Response(bs.data)
        else:
            return Response(bs.errors)

    def delete(self, request, id):
        Books.objects.filter(id=id).delete()
        return Response()

方式二

urls.py同方式一

views.py

from rest_framework import mixins
from rest_framework import generics


class BooksView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Books.objects.all()
    serializer_class = BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class BooksDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,
                      generics.GenericAPIView):
    queryset = Books.objects.all()
    serializer_class = BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

方式三

urls.py同方式一

views.py

from rest_framework import generics


class BooksView(generics.ListCreateAPIView):
    queryset = Books.objects.all()
    serializer_class = BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class BooksDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Books.objects.all()
    serializer_class = BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

方式四

urls.py

from django.urls import path, re_path

urlpatterns = [
    # as_view()需要传字典参数,是因为viewsets.ModelViewSet类继承了viewsets.ViewSetMixin,这里调用的as_view()方法是viewsets.ViewSetMixin定义的方法
    path('books/', BooksView.as_view({'get': 'list', 'post': 'create'}), name='Books'),
    re_path('^books/(?P<pk>\d+)/$', BooksView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}), name="BooksDetail"),
]

views.py

from rest_framework import viewsets


class BooksView(viewsets.ModelViewSet):
    queryset = Books.objects.all()
    serializer_class = BookModelSerializer

viewsets.ModelViewSet类继承了mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet,在实际使用中为了方便使用可根据需要实现的方法继承mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin中的部分类和viewsets.GenericViewSet类。

如果接口需要处理复杂的逻辑,可以只继承viewsets.GenericViewSet类,在urls.py中配置请求方式与响应视图函数。

viewsets.GenericViewSet可使用的配置组件包括:

    renderer_classes 渲染器
    parser_classes 解析器
    authentication_classes 认证组件
    throttle_classes 频率组件
    permission_classes 权限组件
    content_negotiation_class 内容协商类
    metadata_class 元数据类
    versioning_class 版本控制组件
    
    serializer_class 序列化类
    pagination_class 分页器
    filter_backends 过滤器

后面三个组件是在viewsets.GenericViewSet类中定义的,前面八个组件定义在views.APIView类中。继承GenericViewSet时,serializer_class必须指定序列化类,queryset必须要指定和序列化类相同的模型类的queryset集合。

posted @ 2019-07-03 16:42  Wuliwawa  阅读(108)  评论(0编辑  收藏  举报