视图代码
基于APIView五个接口
"""第一层"""
from rest_framework.views import APIView
class BookAPIView(APIView):
def get(self, request):
book_list = Book.objects.all()
ser = BookSerializer(instance=book_list,many=True)
return Response(ser.data)
def post(self, request):
ser = BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class BookDetailAPIView(APIView):
def put(self, request, pk):
book = Book.objects.filter(pk=pk).first()
ser = BookSerializer(instance=book,data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
def get(self, request, pk):
book = Book.objects.all().filter(pk= pk).first()
ser = BookSerializer(instance=book)
return Response(ser.data)
def delete(self, request, pk):
Book.objects.filter(pk=pk).delete()
return Response()
基于GenricAPIView
from rest_framework.generics import GenericAPIView
class BookAPIView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
ser = self.get_serializer(instance=self.get_queryset(), many=True)
return Response(ser.data)
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class BookDetailAPIView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def put(self, request, pk):
ser = self.get_serializer(instance=self.get_object(), data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
def get(self, request, pk):
ser = self.get_serializer(instance=self.get_object())
return Response(ser.data)
def delete(self, request, pk):
self.get_object().detele()
return Response()
类中源码方法解析




基于五个视图扩展类五个接口
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, \
DestroyModelMixin
"""获取所有数据接口"""
class BookGenericList(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
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 BookGeneric(GenericAPIView, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
封装之后的视图子类
from rest_framework.generics import ListAPIView, CreateAPIView, UpdateAPIView, RetrieveAPIView, DestroyAPIView
class BookView(ListAPIView, CreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetail(UpdateAPIView, RetrieveAPIView, DestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
路由
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('books/', views.BookView.as_view()), # 获取所有创建
path('books/<int:pk>', views.BookDetail.as_view()), # 获取单个更新删除
继承视图子类之后内部封装了五个请求方法不需要写
# 封装之后的LIstAPIView
class ListAPIView(mixins.ListModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
# 视图源码
class ListModelMixin:
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
路由自动生成与自己写的路由获取所有与获取单条数据需要区分
- 自己写的路由没有重写as_view方法没有对应关系视图类需要分两个视图类写
- path('books/', views.BookView.as_view()),
- path('books/int:pk', views.BookDetail.as_view()),
- 重写了as_view在路由中写好对应关系后不需要分开写两个类
- path('books/', views.BookView.as_view({'get':'list','post':'create'}))
- path('books/int:pk',views.BookView.as_view({'put':'update','get':'retrieve','delete':'destroy'}))

浙公网安备 33010602011771号