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集合。
                    
                
                
            
        
浙公网安备 33010602011771号