• 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)
    
    
    
  • 相关阅读:
    NFS服务
    SSH服务
    DNS服务器
    FTP服务器
    linux(磁盘配额)
    linux(ACL权限控制)
    linux(日志)
    linux(系统安全)
    linux(进程和计划任务)
    linux(引导)
  • 原文地址:https://www.cnblogs.com/Sheppard/p/11922624.html
Copyright © 2020-2023  润新知