GenericAPIView视图

rest_framework.generics.GenericAPIView

继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。

支持定义的属性:
  • 列表视图与详情视图通用:
    • queryset 列表视图的查询集
    • serializer_class 视图使用的序列化器
  • 列表视图使用:
    • pagination_class 分页控制类
    • filter_backends 过滤控制后端
  • 详情页视图使用:
    • lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
    • lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同
提供的方法:
  • 列表视图与详情视图通用:

    • get_queryset(self)

      返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写

    • get_serializer_class(self)

      返回序列化器类,默认返回serializer_class,可以重写

    • get_serializer(self, args, *kwargs)

      返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。

      注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

  • 详情视图使用:

    • get_object(self) 返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。

      若详情访问的模型类对象不存在,会返回404。

      该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

GenericAPIView视图演示python代码如下:

from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from book_drf.serializer import BookSerializer
from books.models import BookInfo


class Books(GenericAPIView):
    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    serializer_class = BookSerializer  # 指定当前类视图使用的序列化器

    def get(self, request):
        # 1、查询所有图书对象
        # books = BookInfo.objects.all() APIView
        # 此处跟APIView不一样
        books = self.get_queryset()  # 获取查询集中的所有数据
        # ser = BookSerializer(books, many=True) APIView
        # 此处跟APIView不一样
        ser = self.get_serializer(books, many=True)  # 使用指定序列化器,获取序列化器对象

        return Response(ser.data)

    def post(self, request):
        # 1、获取前端数据
        data = request.data
        # 2、验证数据
        ser = self.get_serializer(data=data)  # 使用指定序列化器,获取序列化器对象
        ser.is_valid()  # 验证方法

        # 3、保存数据
        ser.save()
        # 4、返回结果
        return Response(ser.data)


class Book(GenericAPIView):
    def get(self, request):
        book = BookInfo.objects.get(id=1)
        ser = BookSerializer(book)

        return Response(ser.data)


class BookDRFView(GenericAPIView):
    """
        获取单一和更新和删除
    """

    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    serializer_class = BookSerializer  # 指定当前类视图使用的序列化器

    def put(self, request, pk):
        # 1、获取前端数据
        data = request.data
        # 2、验证数据
        try:
            # book = BookInfo.objects.get(id=pk) APIView
            # 此处跟APIView 不一样
            book = self.get_object()  # 从查询集中获取指定的单一数据对象
        except:
            return Response({'error': '错误信息'}, status=400)
        ser = BookSerializer(book, data=data)
        ser.is_valid()
        print(ser.validated_data)
        print(ser.errors)
        # 3、更新数据
        ser.save()
        # 4、返回结果
        return Response(ser.data)

    def delete(self, request, pk):
        # 1、查询数据对象
        try:
            # book = BookInfo.objects.get(id=pk)
            book = self.get_object()
            book.delete()
            print(book)
        except:
            return Response({'error': '错误信息'}, status=400)
        return Response({})

​​​​​​​