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 = BookModelSerializerviewsets.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集合。