1. 视图集ViewSet
2. 常用视图集父类
注意:ViewSetMixin 这个类的作用是把dispatch中的路由分发修改了,所以五个接口写在同一个类视图中没有任何问题
3. ViewSet实现增删改查接口
(1). views.py代码
from rest_framework import viewsets
class BookViewSet(viewsets.ViewSet): # ViewSet类继承自APIView
"""ViewSet视图集"""
def list(self, request):
# 获取查询集
books = BookInfo.objects.all()
# 序列化
serializer = BookInfoSerializer(books, many=True)
# 响应
return Response(data=serializer.data)
def create(self, request):
# 获取前端请求体, 创建序列化器对象,反序列化
serializer = BookInfoSerializer(data=request.data)
# 校验
serializer.is_valid(raise_exception=True)
# 保存
serializer.save()
# 响应
return Response(data=serializer.data, status=status.HTTP_201_CREATED)
def retrieve(self, request, pk):
# 查询实例
try:
book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return Response({"err": "没有要查的图书信息"}, status=status.HTTP_404_NOT_FOUND)
# 创建序列化器,反序列化
serializer = BookInfoSerializer(instance=book)
return Response(serializer.data)
def update(self, request, pk):
# 查询实例
try:
book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return Response({"err": "没有要查的图书信息"}, status=status.HTTP_404_NOT_FOUND)
# 获取前端请求体, 创建序列化器对象,反序列化
serializer = BookInfoSerializer(instance=book, data=request.data)
# 校验
serializer.is_valid(raise_exception=True)
# 保存
serializer.save()
# 响应
return Response(data=serializer.data, status=status.HTTP_201_CREATED)
def destroy(self, request, pk):
# 查询实例
try:
book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return Response({"err": "没有要查的图书信息"}, status=status.HTTP_404_NOT_FOUND)
book.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
(2)urls.py代码
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
# 图书视图集对应的路由ViewSet
path("vbooks/", csrf_exempt(views.BookViewSet.as_view({"get": "list", "post": "create"})), name="booklist"),
re_path("^vbooks/(?P<pk>\d+)/$", csrf_exempt(views.BookViewSet.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})), name="bookdetail"),
]
也就是说一个类视图:BookViewSet 绑定了上面两个路由
4. GenericViewSet+Mixin扩展类实现增删改查接口
(1)视图终极大招
from rest_framework import viewsets
# class BookViewSet(ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, viewsets.GenericViewSet): # GenericViewSet类继承自GenericAPIView
# class BookViewSet(viewsets.ReadOnlyModelViewSet):
class BookViewSet(viewsets.ModelViewSet):
"""ViewSet视图集"""
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
(2)路由终极大招
from rest_framework.routers import DefaultRouter
from . import views
urlpatterns = [
# 图书视图集对应的路由ViewSet
# path("vbooks/", csrf_exempt(views.BookViewSet.as_view({"get": "list", "post": "create"})), name="booklist3"),
# re_path("^vbooks/(?P<pk>\d+)/$", csrf_exempt(views.BookViewSet.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})), name="bookdetail3"),
]
router = DefaultRouter() # 创建路由器
router.register(prefix="vbooks", viewset=views.BookViewSet) # 注册路由
urlpatterns += router.urls # 把生成好的路由拼接到urlpatterns中