zoukankan      html  css  js  c++  java
  • DRF接口操作--群增,群更,群删

    1.一个表可不可以有多个自增字段
    2.用APIView,GenericAPIView,ModelViewSet重写Book的接口
    1.一个表可不可以有多个自增字段
    class Test(models.Model):
    id = models.AutoField(primary_key=True)
    index = models.AutoField()
    name = models.CharField(max_length=12)

    """
    assert not cls._meta.auto_field, "Model %s can't have more than one AutoField." % cls._meta.label
    AssertionError: Model api.Test can't have more than one AutoField.
    """
    2.用APIView,GenericAPIView,ModelViewSet重写Book的接口
    (1)APIView重写Book接口
    class BookAPIView(APIView):
    def get(self, request, *args, **kwargs):
    # 查询,单个查询和多个查询
    pk = kwargs.get('pk', None)
    if pk:
    book_obj = models.Book.objects.filter(pk=pk).first()
    if book_obj:
    book_ser = BookSerializer(instance=book_obj)
    return APIResponse(msg='成功获取数据', data=book_ser.data)
    else:
    return APIResponse(code='101', msg='获取数据失败', data={'result': '无效的主键值'})
    else:
    book_queryset = models.Book.objects.all()
    book_ser = BookSerializer(instance=book_queryset, many=True)
    return APIResponse(msg='成功获取数据', data=book_ser.data)

    def post(self, request, *args, **kwargs):
        """
        传过来的是一个字典,增加一条
        传过来的是一个列表套字典,增加多条数据
        """
        book_ser = None
        if isinstance(request.data, dict):
            book_ser = BookSerializer(data=request.data)
        elif isinstance(request.data, list):
            book_ser = BookSerializer(data=request.data, many=True)
        book_ser.is_valid(raise_exception=True)
        book_ser.save()
        return APIResponse(msg='成功增加数据', data=book_ser.data)
    
    def put(self, request, *args, **kwargs):
        if kwargs.get('pk', None):
            book_obj = models.Book.objects.filter(pk=kwargs.get('pk')).first()
            if book_obj:
                book_ser = BookSerializer(instance=book_obj, data=request.data)
                book_ser.is_valid(raise_exception=True)
                book_ser.save()
                return APIResponse(msg='成功更新数据', data=book_ser.data)
            else:
                return APIResponse(msg='更新数据失败', data={'result': '无效的主键值'})
        else:
            book_list = []
            modify_data = []
            for item in request.data:
                pk = item.pop('id')
                book_list.append(models.Book.objects.get(pk=pk))
                modify_data.append(item)
            book_ser = BookSerializer(instance=book_list, data=modify_data, many=True)
            book_ser.is_valid(raise_exception=True)
            book_ser.save()
            return APIResponse(msg='成功更新数据', data=book_ser.data)
    
    def delete(self, request, *args, **kwargs):
        pk = kwargs.get('pk', None)
        pks = [pk, ] if pk else request.data.get('pks')
        ret = models.Book.objects.filter(pk__in=pks, is_delete=False).update(is_delete=True)
        ret_dict = {'msg': '删除数据成功'} if ret else {'code': '101', 'msg': '删除数据失败'}
        return APIResponse(**ret_dict)
    

    BookSerializer&BookListSerializer
    class BookListSerializer(serializers.ListSerializer):
    """
    ListSerializer里面有create方法,没有update方法,需要你重写
    """

    def update(self, instance, validated_data):
        return [
            self.child.update(instance[i], attr) for i, attr in enumerate(validated_data)
        ]
    

    class BookSerializer(serializers.ModelSerializer):
    # 在models中写方法
    class Meta:
    list_serializer_class = BookListSerializer
    model = Book
    fields = ('id','name', 'price', 'publish', 'authors', 'publish_name', 'author_list')
    extra_kwargs = {
    'publish': {'write_only': True},
    'publish_name': {'read_only': True},
    'authors': {'write_only': True},
    'author_list': {'read_only': True}
    }
    (2)用GenericAPIView写Book接口
    class Book4view(GenericAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer
    pk = None

    def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())
        filter_kwargs = {self.lookup_field: self.pk}
        return queryset.filter(**filter_kwargs)
    
    def get_queryset(self):  # 重写get_queryset方法
        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            queryset = queryset.all()
        return queryset.filter(is_delete=False)
    
    def get(self, request, *args, **kwargs):
        # 查询单个和查询多个
        self.pk = kwargs.get('pk', None)
        if self.pk:
            book = self.get_object().first()
            if book:
                book_ser = self.get_serializer(book)
                return APIResponse(msg='成功获取数据', data=book_ser.data)
            else:
                return APIResponse(msg='获取数据失败', data={'result': '无效的主键值'})
        else:
            book_queryset = self.get_queryset()
            book_ser = self.get_serializer(book_queryset, many=True)
            return APIResponse(msg='成功获取数据', data=book_ser.data)
    
    def post(self, request, *args, **kwargs):
        # 单增和群增
        book_ser = None
        if isinstance(request.data, dict):
            book_ser = self.get_serializer(data=request.data)
        elif isinstance(request.data, list):
            book_ser = self.get_serializer(data=request.data, many=True)
        if book_ser:
            book_ser.is_valid(raise_exception=True)
            book_ser.save()
            return APIResponse(msg='成功增加数据', data=book_ser.data)
        else:
            return APIResponse(code='106', msg='未知错误')
    
    def put(self, request, *args, **kwargs):
        # 单修改和群修改
        self.pk = kwargs.get('pk', None)
        book_ser = None
        if self.pk:
            instance = self.get_object().first()
            book_ser = self.get_serializer(instance=instance, data=request.data)
        else:
            book_list = []
            modify_data = []
            for item in request.data:
                self.pk = item.pop('id')
                book_list.append(self.get_object().first())
                modify_data.append(item)
            book_ser = self.get_serializer(instance=book_list, data=modify_data, many=True)
        book_ser.is_valid(raise_exception=True)
        book_ser.save()
        return APIResponse(msg='修改数据成功', data=book_ser.data)
    
    def delete(self, request, *args, **kwargs):
        """
        单个删除和多个删除
        """
        self.pk = kwargs.get('pk', None)
        if self.pk:
            if self.get_object():
                self.get_object().update(is_delete=True)
                return APIResponse(msg='删除数据成功')
            else:
                return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})
        else:
            pks = request.data.get('pks')
            record = 0
            for pk in pks:
                self.pk = pk
                if self.get_object():
                    self.get_object().update(is_delete=True)
                    record += 1
            if record:
                return APIResponse(msg='删除数据成功', data={'result': f'一共删除{record}条数据'})
            else:
                return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})
    

    (3)用ModelViewSet写Book的接口
    class Book5view(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer
    pk = None

    def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())
        filter_kwargs = {self.lookup_field: self.pk}
        return queryset.filter(**filter_kwargs)
    
    def get_queryset(self):
        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            queryset = queryset.all()
        return queryset.filter(is_delete=False)
    
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object().first()
        if instance:
            book_ser = self.get_serializer(instance)
            return APIResponse(msg='成功获取数据', data=book_ser.data)
        else:
            return APIResponse(code='102', msg='获取数据失败', data={'result': '无效的主键值'})
    
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        print(222)
        return APIResponse(msg='获取数据成功', data=serializer.data)
    
    def create(self, request, *args, **kwargs):
        assert isinstance(request.data, dict) or isinstance(request.data, list), (
            'The type of `request.data`  must be `dict` or `list`'
        )
        if isinstance(request.data, dict):
            serializer = self.get_serializer(data=request.data)
        else:
            serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        return APIResponse(msg='创建数据成功', data=serializer.data)
    
    def obtain(self, request, *args, **kwargs):
        """单查还是多查"""
        self.pk = kwargs.get('pk', None)
        print(self.pk)
        if self.pk:
            response = self.retrieve(request, *args, **kwargs)
        else:
            response = self.list(request, *args, **kwargs)
        return response
    
    def add(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)
    
    def update(self, request, *args, **kwargs):
        assert isinstance(request.data, dict) or isinstance(request.data, list), (
            'The type of `request.data` must be `dict` or `list`'
        )
        if isinstance(request.data, dict):
            self.pk = kwargs.get('pk', None)
            if not self.pk:
                return APIResponse(code='104', msg='数据更新失败', data={'result': '缺少主键参数'})
            if not self.get_object():
                return APIResponse(code='103', msg='数据更新失败', data={'result': '无效的主键字段'})
            serializer = self.get_serializer(self.get_object().first(), data=request.data)
        else:
            book_list = []
            modify_data = []
            for item in request.data:
                self.pk = item.pop('id')
                book_list.append(self.get_object().first())
                modify_data.append(item)
            serializer = self.get_serializer(instance=book_list, data=modify_data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        return APIResponse(msg='数据更新成功', data=serializer.data)
    
    def delete(self, request, *args, **kwargs):
        self.pk = kwargs.get('pk', None)
        pks = request.data.get('pks')
        if not self.pk and not pks:
            return APIResponse(code='103', msg='删除数据失败', data={'result': '缺少主键值'})
        elif self.pk:
            if self.get_object():
                self.get_object().update(is_delete=True)
                return APIResponse(msg='删除数据成功')
            else:
                return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})
        elif pks:
            ret = 0
            for pk in pks:
                self.pk = pk
                if self.get_object():
                    self.get_object().update(is_delete=True)
                    ret += 1
            if ret:
                return APIResponse(msg='删除数据成功', data={'result': f'一共删除{ret}条数据'})
            else:
                return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})
  • 相关阅读:
    软件大赛excel转换
    迷你表单美化框架 Ideal Forms
    FLV播放器代码 网页FLV在线播放代码
    网站被降权了该怎么办
    jQuery弹出层插件bPopup
    如何去增加外部链接
    IIS MIME设置
    jQuery无缝滚动
    jQuery表单验证插件 jQuery validate
    dedecms实现关键字自动加内链
  • 原文地址:https://www.cnblogs.com/surpass123/p/13301530.html
Copyright © 2011-2022 走看看