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

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中

猜你喜欢

转载自blog.csdn.net/weixin_42289273/article/details/114180398