【愚公系列】2022年04月 Python教学课程 67-DRF框架之GenericAPIView

举报
愚公搬代码 发表于 2022/04/17 22:39:19 2022/04/17
【摘要】 一、GenericAPIView此类扩展了 REST 框架的类,为标准列表视图和详细信息视图添加了通常需要的行为。GenericAPIView继承于APIView。以下属性控制基本视图行为。queryset:应用于从此视图返回对象的查询集。通常,必须设置此属性或重写该方法。如果要重写视图方法,请务必调用而不是直接访问此属性,因为将评估一次,并且这些结果将缓存用于所有后续请求。seriali...

一、GenericAPIView

此类扩展了 REST 框架的类,为标准列表视图和详细信息视图添加了通常需要的行为。GenericAPIView继承于APIView。

以下属性控制基本视图行为。

  • queryset:应用于从此视图返回对象的查询集。通常,必须设置此属性或重写该方法。如果要重写视图方法,请务必调用而不是直接访问此属性,因为将评估一次,并且这些结果将缓存用于所有后续请求。
  • serializer_class:应用于验证和反序列化输入以及序列化输出的序列化程序类。通常,必须设置此属性或重写该方法。
  • lookup_field:应用于执行各个模型实例的对象查找的模型字段。缺省值为 。请注意,使用超链接 API时,如果需要使用自定义值,则需要确保 API 视图和序列化程序类都设置了查找字段。
  • lookup_url_kwarg:应用于对象查找的 URL 关键字参数。URL conf应包含与此值对应的关键字参数。如果未设置,则默认使用与 相同的值。
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response

from book.models import BookInfo
from drf_book.serializer import BookSerializer


class BooksGenericAPIView(GenericAPIView):
    """
           获取所有图书和保存图书
    """
    # 指定查询集属性
    queryset = BookInfo.objects.all()
    # 指定序列化器
    serializer_class = BookSerializer

    def get(self, request):
        """
            获取所有图书
        :param request:
        :return:
        """
        # 1、查询图书表获取所有图书对象  self.get_queryset() 获取queryset属性中的所有数据
        books = self.get_queryset()
        # 2、提取所有对象的字段内容
        # 初始化生成序列化器对象 self.get_serializer 获取serializer_class所指定的序列化器进行初始化操作
        ser = self.get_serializer(books, many=True)
        # 使用序列化器对象的data方法获取序列化后的结果
        data = ser.data
        # 3、返回所有对象字段内容
        return Response({'book_list': data})

    def post(self, request):
        """
            保存图书
        :param request:
        :return:
        """
        # 1、获取保存的图书数据
        data = request.data
        # 2、验证图书数据字段
        ser = self.get_serializer(data=data)
        # is_valid是序列化器的验证方法
        ser.is_valid(raise_exception=True)  # raise_exception=True 验证失败直接返回
        # ser.errors获取验证结果信息
        # 3、保存图书
        # 调用序列化器中封装保存方法create
        ser.save()

        return Response(ser.data)


class BookGenericAPIView(GenericAPIView):
    """
           获取单一图书数据
           更新图书
           删除图书
       """
    # 指定查询集属性
    queryset = BookInfo.objects.all()
    # 指定序列化器
    serializer_class = BookSerializer

    def get(self, request, pk):
        """
        获取单一图书数据
        :param request:
        :param pk:
        :return:
        """
        # 1、根据pk值查询图书对象
        try:
            #  self.get_object()从queryset中获取当前pk所对应的数据对象
            book = self.get_object()
        except:
            return Response({'error': '错误的id值'})
        # 2、返回图书数据
        ser = self.get_serializer(book)
        return Response(
            ser.data
        )

    def put(self, request, pk):
        """
         更新图书
        :param request:
        :param pk:
        :return:
        """
        # 1、获取保存的图书数据
        data = request.data
        # 2、验证图书数据字段
        try:
            book = self.get_object()
        except:
            return Response({'error': '错误的id值'})
        ser = self.get_serializer(book)
        # is_valid是序列化器的验证方法
        ser.is_valid(raise_exception=True)  # raise_exception=True 验证失败直接返回
        # 3、更新图书
        ser.save()
        # # 4、返回保存后的图书数据
        return Response(ser.data)

    def delete(self, request, pk):
        """
        删除图书
        :param request:
        :param pk:
        :return:
        """
        # 1、查询删除的图书对象
        try:
            book = self.get_serializer()
        except:
            return Response({'error': '错误的id值'})
        # 2、逻辑
        book.is_delete = True
        book.save()
        # 物理删除
        # book.delete()

        # 3、返回结果
        return Response({})

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。