DRF之基本视图集(ViewSet)、通用视图集(GenericViewSet)

一、基本视图集ViewSet

基于视图集和路由实现API接口

前面的接口在实现的过程中,也存在了代码重复的情况,我们如果合并成一个接口类,则需要考虑2个问题:

1.路由的合并问题

2.get方法重复问题

drf提供了视图集可以解决以上问题

from rest_framework.viewsets import ViewSet

代码:

views.py

from rest_framework.viewsets import ViewSet

class StudentViewSet(ViewSet):

    def get_student_list(self, request):
        """获取所有学生信息"""
        # 1.从数据库中读取学生信息
        student_list = Students.objects.all()
        # 2.实例化序列化器,获取序列化器对象
        serializer = StudentModelSerializer(instance=student_list, many=True)
        # 3.转换数据并返回给客户端
        return Response(serializer.data, status=status.HTTP_200_OK)

    def post_student_info(self, request):
        """添加一条学生信息"""
        # 1.获取客户端提交的数据,实例化序列化器,获取实例化对象
        serializer = StudentModelSerializer(data=request.data)
        # 2.反序列化(数据验证,保存到数据库)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        # 3.返回新增的模型数据给客户端
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    def get_student_info(self, request, pk):
        """获取一条数据"""
        # 1.根据pk值获取一条数据
        try:
            student = Students.objects.get(pk=pk)
        except Students.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        # 2.实例化序列化器对象
        serializer = StudentModelSerializer(instance=student)
        # 3.转换数据,并返回给客户端
        return Response(serializer.data, status=status.HTTP_200_OK)

    def put_student_info(self, request, pk):
        """更新一条数据"""
        try:
            student = Students.objects.get(pk=pk)
        except Students.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        # 实例化序列化对象,获取客户端传入的数据
        serializer = StudentModelSerializer(instance=student, data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

    def delete_student_info(self, request, pk):
        """删除一条数据"""
        try:
            Students.objects.get(pk=pk).delete()
        except Students.DoesNotExist:
            pass
        return Response(status=status.HTTP_204_NO_CONTENT)

urls.py

 # 视图集
    re_path('^students5/(?P<pk>\d+)/$', views.StudentViewSet.as_view({
        "get": "get_student_info",
        "put": "put_student_info",
        "delete": "delete_student_info",
    })),
    path('students5/', views.StudentViewSet.as_view({
        "get": "get_student_list",
        "post": "post_student_info",
    })),

二、通用视图集GenericViewSet

views.py

"通用视图集GenericViewSet"
from rest_framework.viewsets import GenericViewSet

class StudentGenericViewSet(GenericViewSet):
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializer

    def get_student_list(self, request):
        """获取所有学生信息"""
        # 1.从数据库中读取信息
        queryset = self.queryset
        # 2.序列化
        serializer = self.get_serializer(instance=queryset, many=True)

        return Response(serializer.data)

    def post_student_info(self, request):
        """添加一个数据"""
        # 1.获取客户端传来的数据,实例化序列化器,获取实例化对象
        serializer = self.get_serializer(data=request.data)
        # 2.反序列化
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

    def get_student_info(self, request, pk):
        """获取一个数据"""
        # 1.通过pk值获取对应数据
        instance = self.get_object()
        # 2.序列化
        serializer = self.get_serializer(instance=instance)

        return Response(serializer.data)

    def put_student_info(self, request, pk):
        """更新一条数据"""
        instance = self.get_object()
        serializer = self.get_serializer(instance=instance, data=request.data)

        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

    def delete_student_info(self, request, pk):
        """删除一条数据"""
        self.get_object().delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

urls.py

    # 通用视图集
    re_path('^students6/(?P<pk>\d+)/$', views.StudentGenericViewSet.as_view({
        "get": "get_student_info",
        "put": "put_student_info",
        "delete": "delete_student_info",})),
    path('students6/', views.StudentGenericViewSet.as_view({
        "get": "get_student_list",
        "post": "post_student_info",})),

三、通用视图集 + 混入类

class StudentMixinViewSet(GenericViewSet, ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,
                          DestroyModelMixin):
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializer

最终版!五个合成一个ModelViewSet

from rest_framework.viewsets import ModelViewSet

class StudentModelViewSet(ModelViewSet):
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializer

"""
class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
"""

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值