DRF_5 两个基本类

两个基本类

  1. APIView

from rest_franmework.views import APIView
APIViewView的不同之处在于:

  1. 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
  2. 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
  3. 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  4. 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

代码案例:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin
from .models import BookInfo, HeroInfo
from book.serializers import BookSerializer, HeroSerializer


class BooksView(APIView):
    def get(self, request):
        """
        获取所有图书
        :param request:
        :return:
        """
        books = BookInfo.objects.all()

        # 序列化处理,返回操作
        ser = BookSerializer(books, many=True)
        data = ser.data
        return Response(data)

    def post(self, request):
        """
        保存图书
        :param request:
        :return:
        """
        # 1. 获取前端数据
        data = request.data

        # 2. 验证数据
        ser = BookSerializer(data=data)
        ser.is_valid(raise_exception=True)
        print(ser.errors)

        # 3. 保存数据
        ser.save()

        # 4. 返回结果
        return Response(ser.data)


class BookView(APIView):
    def get(self, request, pk):
        """
        获取单一图书
        :param request:
        :param pk: 查询图书的id
        :return:
        """
        # 1. 查询数据 --》 验证过程
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return Response({'error': '错误的id'}, status=400)

        # 返回结果
        ser = BookSerializer(book)
        return Response(ser.data)

    def put(self, request, pk):
        """
        更新单一图书
        :param request:
        :param pk:
        :return:
        """
        # 1. 获取前端数据
        data = request.data

        # 2. 验证数据
        book = BookInfo.objects.get(id=pk)
        ser = BookSerializer(book, data=data)

        # 3. 处理数据 --》 更新数据
        ser.is_valid(raise_exception=True)
        ser.save()

        # 4. 返回结果
        return Response(ser.data)

    def delete(self, request, pk):
        """
        删除单一图书
        :param request:
        :param pk:
        :return:
        """
        pass
  1. GenericAPIView

from rest_framework.generics import GenericAPIView

class BooksView(GenericAPIView):
    serializer_class = BookSerializer  # 指定序列化器
    queryset = BookInfo.objects.all()  # 指定数据对象查询集

支持定义的属性:

  • 列表视图与详情视图通用:
    • queryset 列表视图的查询集
    • serializer_class 视图使用的序列化器
  • 列表视图使用:
    • pagination_class 分页控制类
    • filter_backends 过滤控制后端
  • 详情页视图使用:
    • lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
    • lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同
      提供的方法:
  1. self.get_serializer() : 调用序列化器
  2. self.get_queryset() : 获取序列化器对象
  3. self.get_object() : 获取查询集中的单一对象
  4. self.get_serializer_class() : 获取序列化类

代码案例:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin
from .models import BookInfo, HeroInfo
from book.serializers import BookSerializer, HeroSerializer


class BooksView(GenericAPIView):
    serializer_class = BookSerializer  # 指定序列化器
    queryset = BookInfo.objects.all()  # 指定数据对象查询集

    def get(self, request):
        """
        获取所有图书
        :param request:
        :return:
        """
        # 查询
        books = self.get_queryset() # 获取查询集所有数据

        # 序列化操作
        ser = self.get_serializer(books, many=True)
        return Response(ser.data)

    def post(self, request):
        """
        保存图书
        :param request:
        :return:
        """
        # 1. 获取前端数据
        data = request.data

        # 2. 验证数据
        ser = self.get_serializer(data=data)
        ser.is_valid(raise_exception=True)
        print(ser.errors)

        # 3. 保存数据
        ser.save()

        # 4. 返回结果
        return Response(ser.data)


class BookView(GenericAPIView):
    serializer_class = BookSerializer  # 指定序列化器
    queryset = BookInfo.objects.all()  # 指定数据对象查询集

    def get(self, request, pk):
        """
        获取单一图书
        :param request:
        :param pk: 查询图书的id
        :return:
        """
        # 1. 查询数据 --》 验证过程
        try:
            book = self.get_object()  # 从查询集中,获取单一数据对象
        except:
            return Response({'error': '错误的id'}, status=400)

        # 返回结果
        ser = self.get_serializer(book)  # 获取序列化器对象
        return Response(ser.data)

    def put(self, request, pk):
        """
        更新单一图书
        :param request:
        :param pk:
        :return:
        """
        # 1. 获取前端数据
        data = request.data

        # 2. 验证数据
        book = self.get_object(id=pk)
        ser = self.get_serializer(book, data=data)

        # 3. 处理数据 --》 更新数据
        ser.is_valid(raise_exception=True)
        ser.save()

        # 4. 返回结果
        return Response(ser.data)

    def delete(self, request, pk):
        """
        删除单一图书
        :param request:
        :param pk:
        :return:
        """
        pass
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Django: csrf防御机制 csrf攻击过程 1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登...
    lijun_m阅读 1,151评论 0 0
  • 网站Api开发 网站API也称接口,其实与网站的URL地址是同一个原理。当用户使用GET或者POST方式访问接...
    虐心笔记阅读 3,473评论 0 1
  • DRF框架包含序列化器,视图以及URL视图,三者密不可分,因此本篇聊的是视图部分。在django中rest_fra...
    咏远瑞智阅读 866评论 0 0
  • > Django’s generic views... were developed as a shortcut ...
    kiven_xu阅读 431评论 0 0
  • API Reference GenericAPIView This class extends REST fram...
    阳光小镇少爷阅读 2,722评论 0 1

友情链接更多精彩内容