day75 作业

1、整理今天所学知识点

2、查看并研究ListAPIView工具视图类,继承该类完成汽车资源的群查接口,汽车资源需要有image资源,查看接口image资源的值

3、研究GenericViewSet工具集,继承该类完成汽车资源的单查,群查,单增,单改,单删接口

from rest_framework.viewsets import ViewSetMixin, GenericViewSet, ViewSet, ModelViewSet

# 六大接口
class CarModelViewSet(ModelViewSet):
    queryset = models.Car.objects.filter(is_delete=False).all()
    serializer_class = serializers.CarModelSerializer

    # 分析:从实际开发角度分析不合理点
    # 1、没有群增、群整体增、群局部增、群删四个接口
    # 2、删除操作视图集默认走的destroy方法实际将资源从数据库中删除,通常一个做字段is_delete字段修改表示删除
    # 3、响应的结果只有数据,没有数据状态码和状态信息

    # 解决1:
    # 群整体改,群局部改,群删三个接口可以独立成三个方法
    def many_update(self, request, *args, **kwargs):
        request_data = request.data
        try:
            pks = []
            for dic in request_data:
                pk = dic.pop('pk')
                pks.append(pk)

            car_query = self.get_queryset().filter(pk__in=pks).all()
            if len(pks) != len(car_query):
                raise Exception('pk对应的数据不存在')
        except Exception as e:
            return Response({'detail': '%s' % e}, status=400)

        car_ser = self.get_serializer(instance=car_query, data=request_data, many=True)
        car_ser.is_valid(raise_exception=True)
        car_list = car_ser.save()
        return APIResponse(results=self.get_serializer(car_list, many=True).data)

        # return APIResponse(msg='这个地方是群整体改,你会写!')

    def many_partial_update(self, request, *args, **kwargs):
        request_data = request.data
        try:
            pks = []
            for dic in request_data:
                pk = dic.pop('pk')
                pks.append(pk)

            car_query = self.get_queryset().filter(pk__in=pks).all()
            if len(pks) != len(car_query):
                raise Exception('pk对应的数据不存在')
        except Exception as e:
            return Response({'detail': '%s' % e}, status=400)

        car_ser = self.get_serializer(instance=car_query, data=request_data, many=True, partial=True)
        car_ser.is_valid(raise_exception=True)
        car_list = car_ser.save()
        return APIResponse(results=self.get_serializer(car_list, many=True).data)
        # return APIResponse(msg='这个地方是群局部改,你会写!')

    def many_destroy(self, request, *args, **kwargs):
        pks = request.data
        try:  #
            rows = self.get_queryset().filter(pk__in=pks).update(is_delete=True)
        except:
            return APIResponse(1, '数据有误')

        if rows:
            return APIResponse(0, '删除成功')
        return APIResponse(1, '删除失败')

    # return APIResponse(msg='这个地方是群删,你会写!')

    # 群增与单增必须公用一个接口,都要走create方法-重写create方法,用逻辑进行拆分
    def create(self, request, *args, **kwargs):
        request_data = request.data
        if isinstance(request_data, list):
            car_ser = self.get_serializer(data=request_data, many=True)
            car_ser.is_valid(raise_exception=True)
            car_obj = car_ser.save()
            return APIResponse(msg='群增成功', results=self.get_serializer(car_obj, many=True).data)

        return super().create(request, *args, **kwargs)

    # 解决2:destory方法完成is_delete字段值修改-重写destory方法,自定义实现体
    def destroy(self, request, *args, **kwargs):
        car_obj = self.get_object()
        car_obj.is_delete = True
        car_obj.save()
        return APIResponse(msg='删除成功')

    # 解决3:让群查有状态码和状态信息-重写list方法
    def list(self, request, *args, **kwargs):
        response = super().list(request, *args, **kwargs)
        return APIResponse(results=response.data)
    

猜你喜欢

转载自www.cnblogs.com/zqfzqf/p/12122112.html