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集合。