day03---通用视图---GenericAPIView

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

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源码:这个函数返回类属性(我们自己定义的),并且,判断这个查询集是否存在,如果之前存在了,则重新查询数据库,保证查询到的数据是最新的。
在这里插入图片描述
2.2: serializer = self.get_serializer:我怎么知道要用那个序列化器来序列化呢??
查看get_serializers源码:
在这里插入图片描述

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

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
        )

测试:
在这里插入图片描述

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

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也可以不用写)
在这里插入图片描述

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

全更新:

    # 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈何碎银没有几两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值