django-rest-framework中视图集ViewSet、GenericViewSet详解
1. 视图集ViewSet



2. 常用视图集父类

注意:ViewSetMixin 这个类的作用是把dispatch中的路由分发修改了,所以五个接口写在同一个类视图中没有任何问题

3. ViewSet实现增删改查接口
(1). views.py代码
from rest_framework import viewsetsclass 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_exempturlpatterns = [# 图书视图集对应的路由ViewSetpath("vbooks/", csrf_exempt(views.BookViewSet.as_view({"get": "list", "post": "create"})), name="booklist"),re_path("^vbooks/(?P\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 DefaultRouterfrom . import viewsurlpatterns = [# 图书视图集对应的路由ViewSet# path("vbooks/", csrf_exempt(views.BookViewSet.as_view({"get": "list", "post": "create"})), name="booklist3"),# re_path("^vbooks/(?P\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中
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
