drf中的增删改查接口

# 单增,群增
def post(self, request, *args, **kwargs):
    '''
        单增:前台提交字典
        群增:前台提交列表套字典
        '''
    request_data = request.data
    if isinstance(request_data, dict):
        # 第一步,把前台提交的字典丢进序列化工具
        book_ser = serializer.Book_modelserializer(data=request_data)
        if book_ser.is_valid():  # 判断数据是否合法
            book_obj = book_ser.save()  # 合法即保存
            return APIResponse(results=serializer.Book_modelserializer(book_obj).data, msg='saved')
        return APIResponse(results=book_ser.errors,msg='valid error', status=2000)
    elif isinstance(request_data, list):
        book_ser = serializer.Book_modelserializer(data=request_data, many=True)
        if book_ser.is_valid(raise_exception=True):  # 判断数据是否合法
            book_obj_list = book_ser.save()  # 合法即保存
            return APIResponse(results=serializer.Book_modelserializer(book_obj_list, many=True).data, msg='saved')
        return APIResponse(results=book_ser.errors,msg='valid error', status=2000)
    else:
        return APIResponse(msg='data error', status=2000)

# 单删与群删  前台发送delete请求时触发
def delete(self, request, *args, **kwargs):
    pk = kwargs.get('pk')
    # print(request.data)
    print('pk', pk)
    print('pks', request.data.get('pks'))
    if pk:  # 如果有pk,则为单删  url: /books/pk/ 单删
        pks = [pk]
        else:  # 群删为delete请求 并且携带数据包,数据包中有键为pks的数据,值为一个个主键值
            pks = request.data.get('pks')
            if not pks:
                return APIResponse(status=2000, msg='pk error')
            results = models.Books.objects.filter(is_delete=0, pk__in=pks).update(is_delete=1)
            if not results:
                return APIResponse(msg=f'delete failed {results}', status=2000)

            return APIResponse(msg='deleted', results=pks)

def get(self, request, *args, **kwargs):  # 单查或多查数据
    pk = kwargs.get('pk')
    # print(pk)
    if pk:  # 单查
        book_obj = models.Books.objects.filter(pk=pk, is_delete=0).first()
        if not book_obj:  # 查不到
            return APIResponse(2001, '单查error')
        else:  # 单查查到了
            # 将查到的数据完成序列化(指定many=false):
            book_data = serializer.Book_modelserializer(book_obj, many=False).data
            return APIResponse(results=book_data)
        else:  # 多查
            book_query = models.Books.objects.filter(is_delete=0).all()
            # 完成序列化
            book_list_data = serializer.Book_modelserializer(book_query, many=True).data
            return APIResponse(results=book_list_data)

单整体改、群整体改

def put(self, request, *args, **kwargs):
    """
        单整体改:前台提交字典,接口 /books/(pk)/
        群整体改:前台提交列表套字典,接口 /books/,注每一个字典都可以通过pk
        """
    pk = kwargs.get('pk')
    request_data = request.data
    if pk: # 单改
        try:
            book_obj = models.Book.objects.get(pk=pk)
            except:
                return APIResponse(1, 'pk error')

            # 修改和新增,都需要通过数据,数据依旧给data,修改与新增不同点,instance要被赋值为被修改对象
            book_ser = serializers.BookModelSerializer(instance=book_obj, data=request_data)
            book_ser.is_valid(raise_exception=True)
            book_obj = book_ser.save()
            return APIResponse(results=serializers.BookModelSerializer(book_obj).data)
        else:  # 群改
            if not isinstance(request_data, list) or len(request_data) == 0:
                return APIResponse(1, 'data error', http_status=400)

            # [{pk:1,...}, {pk:3,...}, {pk:100,...}] => [obj1, obj3, obj100] + [{...}, {...}, {...}]
            # 要考虑pk对应的对象是否被删,以及pk没有对应的对象
            # 假设pk3被删,pk100没有 => [obj1] + [{...}]

            # 注:一定不要在循环体中对循环对象进行增删(影响对象长度)的操作
            obj_list = []
            data_list = []
            for dic in request_data:
                # request_data可能是list,单内部不一定是dict
                try:
                    pk = dic.pop('pk')
                    try:
                        obj = models.Book.objects.get(pk=pk, is_delete=False)
                        obj_list.append(obj)
                        data_list.append(dic)
                        except:
                            pass
                        except:
                            return APIResponse(1, 'data error', http_status=400)

                        book_ser = serializers.BookModelSerializer(instance=obj_list, data=data_list, many=True)
                        book_ser.is_valid(raise_exception=True)
                        book_obj_list = book_ser.save()
                        return APIResponse(results=serializers.BookModelSerializer(book_obj_list, many=True).data)

单局部改、群局部改

# 单局部改、群局部改
def patch(self, request, *args, **kwargs):
    """
        单整体改:前台提交字典,接口 /books/(pk)/
        群整体改:前台提交列表套字典,接口 /books/,注每一个字典都可以通过pk
        """
    pk = kwargs.get('pk')
    request_data = request.data
    if pk:
        try:
            book_obj = models.Book.objects.get(pk=pk)
            except:
                return APIResponse(1, 'pk error')
            # 局部修改就是在整体修改基础上设置partial=True,将所有参与反序列化字段设置为required=False
            book_ser = serializers.BookModelSerializer(instance=book_obj, data=request_data, partial=True)
            book_ser.is_valid(raise_exception=True)
            book_obj = book_ser.save()
            return APIResponse(results=serializers.BookModelSerializer(book_obj).data)

        else:  # 群改
            if not isinstance(request_data, list) or len(request_data) == 0:
                return APIResponse(1, 'data error', http_status=400)

            # [{pk:1,...}, {pk:3,...}, {pk:100,...}] => [obj1, obj3, obj100] + [{...}, {...}, {...}]
            # 要考虑pk对应的对象是否被删,以及pk没有对应的对象
            # 假设pk3被删,pk100没有 => [obj1] + [{...}]

            # 注:一定不要在循环体中对循环对象进行增删(影响对象长度)的操作
            obj_list = []
            data_list = []
            for dic in request_data:
                # request_data可能是list,单内部不一定是dict
                try:
                    pk = dic.pop('pk')
                    try:
                        obj = models.Book.objects.get(pk=pk, is_delete=False)
                        obj_list.append(obj)
                        data_list.append(dic)
                        except:
                            pass
                        except:
                            return APIResponse(1, 'data error', http_status=400)

                        book_ser = serializers.BookModelSerializer(instance=obj_list, data=data_list, many=True, partial=True)
                        book_ser.is_valid(raise_exception=True)
                        book_obj_list = book_ser.save()
                        return APIResponse(results=serializers.BookModelSerializer(book_obj_list, many=True).data)

猜你喜欢

转载自www.cnblogs.com/Sheppard/p/11922624.html
今日推荐