一:序列化返回多个模型类对象:

1;视图

class BookView(GenericAPIView):

    # 定义类属性
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializers

    # :序列化返回多个模型类对象
    def get(self, request):

        # 1:获取查询集
        books = self.get_queryset()

        # 2: 获取序列化对象
        serializer = self.get_serializer(
            instance=books,
            many=True
        )

        # 3: 序列化返回
        return Response(data=serializer.data)

2:问题:
2.1:books = self.get_queryset()怎么知道我要查询哪个查询集的呢?
查看get_queryset源码:这个函数返回类属性(我们自己定义的),并且,判断这个查询集是否存在,如果之前存在了,则重新查询数据库,保证查询到的数据是最新的。
day03---通用视图---GenericAPIView_序列化
2.2: serializer = self.get_serializer:我怎么知道要用那个序列化器来序列化呢??
查看get_serializers源码:
day03---通用视图---GenericAPIView_反序列化_02

二:反序列化新建单一资源:

class BookView(GenericAPIView):

    # 定义类属性
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializers

    # 序列化新建单一资源
    def post(self, request):

        # 1:获取序列化对象
        serializer = self.get_serializer(
            data=request.data
        )
        if not serializer.is_valid():
            return Response(
                data= {"errmsg": "参数错误"},
                status= status.HTTP_400_BAD_REQUEST
            )
        # 2: 保存
        serializer.save()
        return Response(
            data=serializer.data
        )

测试:
day03---通用视图---GenericAPIView_其他_03

三:序列化返回单一资源:

queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializers
    lookup_field = "pk"
    lookup_url_kwarg = "pk"

    # 1:序列化返回单一资源
    def get(self, request, pk):

        # 1: 获取查询集
        book = self.get_object()

        # 2: 获取序列化对象
        serializer = self.get_serializer(instance=book)

        # 3:返回响应
        return Response(
            data= serializer.data
        )

问题:self.get_object()提取的依据是什么??
(1)、查询集;—— 默认类属性cls.queryset
(2)、过滤依据字段;—— 默认类属性cls.lookup_field(默认是pk,如果是pk,这个可以不用写)
(3)、获取字段值 —— 通过类属性cls.lookup_url_kwarg指定的正则分组名提取过滤字段的值(默认是pk对应的值,如果是根据pk也可以不用写)
day03---通用视图---GenericAPIView_其他_04

四:反序列化单一资源:(全更新和不全更新)

全更新:

    # 2:反序列化更新(全更新)

    def put(self, request, pk):

        # 获取更新对象
        book = self.get_object()

        # 获取反序列化对象
        serializer = self.get_serializer(instance=book, data=request.data)

        if not serializer.is_valid():
            return Response({
                "errmsg": "反序列化失败"
            })
        serializer.save()
        return Response(
            data=serializer.data
        )

部分更新:

 def patch(self, request, pk):
        # 获取更新对象
        book = self.get_object()

        # 获取反序列化对象
        serializer = self.get_serializer(instance=book, data=request.data, partial=True)

        if not serializer.is_valid():
            return Response({
                "errmsg": "反序列化失败"
            })
        serializer.save()
        return Response(
            data=serializer.data
        )

五:反序列化删除单一对象:

# 3:删除单一资源
    def delete(self, request, pk):
        # 获取查询集对象
        book = self.get_object()
        # 调用delete方法删除
        book.delete()

        return Response(data=None, status=status.HTTP_200_OK)