无法使用 Django Rest Framework 上传多张图片

Unable to upload multiple images with Django Rest Framework

我正在尝试创建一个视图,我可以在其中将图像上传到具有另一个模型外键的单个模型。下面给出的 API 有效,但它只上传 1 张图像。我做错了什么,它只从列表中获取第一张图片并上传到媒体文件夹中?

models.py

class RoofImages(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    job = models.ForeignKey(JobDetails, on_delete=models.PROTECT)
    image = models.ImageField(upload_to=current_user_id)
    image_type = models.CharField(max_length=15, choices=ROOF_VIEW_TYPES)

helpers.py

def modify_input_for_multiple_files(user, job, image, image_type):
 image_dict = {}
 image_dict['user'] = user
 image_dict['job'] = job
 image_dict['image'] = image
 image_dict['image_type'] = image_type
 return image_dict

views.py

class RoofImagesView(APIView):
    serializer_class = RoofImagesSerializer
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, *args, **kwargs):
        user = Token.objects.get(key=request.auth.key).user
        job = request.data['job']
        images = dict((request.data).lists())['image']
        image_type = request.data['image_type']
        flag = True
        arr = []

        for img_name in images:
            modified_data = modify_input_for_multiple_files(user.user_uid, job, img_name, image_type)
            serializer = RoofImagesSerializer(data=modified_data)

            if serializer.is_valid():
                serializer.save()
                arr.append(serializer.data)
            else:
                flag = False
            
            if flag:
                response_content = {
                    'status': True,
                    'message': 'Images uploaded successfully.',
                    'result': arr
                }
                return Response(response_content, status=status.HTTP_201_CREATED)
            else:
                response_content = {
                    'status': False,
                    'message': 'Unable to upload images.',
                    'result': serializer.errors
                }
                return Response(response_content, status=status.HTTP_400_BAD_REQUEST)

下面是仅上传 1 张图片的响应示例

Request screenshot with response

我认为,在 RoofImagesSerializer 中,您需要定义 create 函数。

def RoofImagesSerializer(serializers.ModelSerializer):
    image_file = serializers.FileField(max_length = 1000000, write_only = True)
    
    ...

    def create(self, validated_data):
        image_uri = validated_data.pop("image_file")
        roof_image = RoofImages(**validated_data)
        roof_image.image = image_uri
        roof_image.save()
        return roof_image
       

当然在modify_input_for_multiple_files函数中,image键应该改为image_file

def modify_input_for_multiple_files(user, job, image, image_type):
    image_dict = {}
    image_dict['user'] = user
    image_dict['job'] = job
    image_dict['image_file'] = image       # here I changed the key
    image_dict['image_type'] = image_type
    return image_dict

而且for循环中的逻辑也不正确。我认为 if flag 语句应该在 for 循环之外。

def post(self, request, *args, **kwargs):
    ...
    flag = True
    arr = []

    for img_name in images:
        modified_data = modify_input_for_multiple_files(user.user_uid, job, img_name, image_type)
        serializer = RoofImagesSerializer(data=modified_data)

        if serializer.is_valid():
            serializer.save()
            arr.append(serializer.data)
        else:
            flag = False

    # here I changed
    if flag:
        response_content = {
            'status': True,
            'message': 'Images uploaded successfully.',
            'result': arr
        }
        return Response(response_content, status=status.HTTP_201_CREATED)
    else:
        response_content = {
            'status': False,
            'message': 'Unable to upload images.',
            'result': serializer.errors
        }
        return Response(response_content, status=status.HTTP_400_BAD_REQUEST)

希望对您有所帮助。