Python 如何在Django restframework中将图像作为多部分/表单数据上传?

Python 如何在Django restframework中将图像作为多部分/表单数据上传?,python,django,file-upload,django-rest-framework,Python,Django,File Upload,Django Rest Framework,我正试图从react上载一个图像文件,当我尝试上载一个文件作为响应时,我可以看到该文件以多部分/fromdata的形式发送,但我的响应说不支持的媒体类型multipart/formdata我也尝试使用解析器类=[FileUploadParser]但随后的回复显示文件名丢失。以下是我的BakCEN代码和我目前所做的工作 型号.py class CarPhoto(models.Model): created_by = models.ForeignKey(settings.AUTH_USER

我正试图从react上载一个图像文件,当我尝试上载一个文件作为响应时,我可以看到该文件以
多部分/fromdata
的形式发送,但我的响应说
不支持的媒体类型multipart/formdata
我也尝试使用
解析器类=[FileUploadParser]
但随后的回复显示文件名丢失。以下是我的BakCEN代码和我目前所做的工作

型号.py

class CarPhoto(models.Model):
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, models.CASCADE)
    car = models.ForeignKey(Car, models.CASCADE, verbose_name=_('car'))
    category = models.CharField(
        max_length=255, choices=CATEGORY, null=True, blank=True)
    sub_category = models.CharField(max_length=255, null=True, blank=True)
    file = models.FileField(
        _("Upload documents image"), null=True, blank=True, upload_to=document_upload_to,
    )
class CarProfilePhotoView(RetrieveUpdateDestroyAPIView):
    parser_classes = [FileUploadParser]
    permission_classes = [OIsAuthenticated]
    serializer_class = serializers.PhotoCarSerializer

    def get_queryset(self):
        return models.Car.objects.filter(fleet__managers=self.request.user)

    def put(self, request, filename):
        request.user.profile = models.CarPhoto()
        request.user.profile.file.save(
            '%d.jpg' % request.user.profile.sub_category, request.data['file'])
        return Response({
            "file": request.build_absolute_uri(request.user.profile.file.url),
        })
class CarPhotoSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)
    file = serializers.SerializerMethodField()

    class Meta:
        model = models.CarPhoto
        exclude = ['created_by', 'car']

    def get_file(self, obj):
        if obj.file:
            return self.context['request'].build_absolute_uri(obj.file.url)

    def create(self, validated_data):
        validated_data['created_by'] = self.context['request'].user
        return super().create(validated_data)

class PhotoCarSerializer(serializers.ModelSerializer):
    car_photo = CarPhotoSerializer(
        many=True, source="carphoto_set", required=False
    )

    class Meta:
        model = models.Car
        fields = ["car_photo"]

def update(self, instance, validated_data):
        if 'carphoto_set' in validated_data:
            ids_set = [ndata['id']
                       for ndata in validated_data['carphoto_set'] if 'id' in ndata]
            instance.carphoto_set.exclude(id__in=ids_set).delete()
            for ndata in validated_data['carphoto_set']:
                if ndata.get('id'):
                    note = instance.carphoto_set.get(id=ndata['id'])
                    ndata.pop('id')
                else:
                    note = models.CarPhoto(
                        car=instance, created_by=self.context['request'].user)
                for k, v in ndata.items():
                    setattr(note, k, v)
                note.save()
            validated_data.pop('carphoto_set')

        return super().update(instance, validated_data)
View.py

class CarPhoto(models.Model):
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, models.CASCADE)
    car = models.ForeignKey(Car, models.CASCADE, verbose_name=_('car'))
    category = models.CharField(
        max_length=255, choices=CATEGORY, null=True, blank=True)
    sub_category = models.CharField(max_length=255, null=True, blank=True)
    file = models.FileField(
        _("Upload documents image"), null=True, blank=True, upload_to=document_upload_to,
    )
class CarProfilePhotoView(RetrieveUpdateDestroyAPIView):
    parser_classes = [FileUploadParser]
    permission_classes = [OIsAuthenticated]
    serializer_class = serializers.PhotoCarSerializer

    def get_queryset(self):
        return models.Car.objects.filter(fleet__managers=self.request.user)

    def put(self, request, filename):
        request.user.profile = models.CarPhoto()
        request.user.profile.file.save(
            '%d.jpg' % request.user.profile.sub_category, request.data['file'])
        return Response({
            "file": request.build_absolute_uri(request.user.profile.file.url),
        })
class CarPhotoSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)
    file = serializers.SerializerMethodField()

    class Meta:
        model = models.CarPhoto
        exclude = ['created_by', 'car']

    def get_file(self, obj):
        if obj.file:
            return self.context['request'].build_absolute_uri(obj.file.url)

    def create(self, validated_data):
        validated_data['created_by'] = self.context['request'].user
        return super().create(validated_data)

class PhotoCarSerializer(serializers.ModelSerializer):
    car_photo = CarPhotoSerializer(
        many=True, source="carphoto_set", required=False
    )

    class Meta:
        model = models.Car
        fields = ["car_photo"]

def update(self, instance, validated_data):
        if 'carphoto_set' in validated_data:
            ids_set = [ndata['id']
                       for ndata in validated_data['carphoto_set'] if 'id' in ndata]
            instance.carphoto_set.exclude(id__in=ids_set).delete()
            for ndata in validated_data['carphoto_set']:
                if ndata.get('id'):
                    note = instance.carphoto_set.get(id=ndata['id'])
                    ndata.pop('id')
                else:
                    note = models.CarPhoto(
                        car=instance, created_by=self.context['request'].user)
                for k, v in ndata.items():
                    setattr(note, k, v)
                note.save()
            validated_data.pop('carphoto_set')

        return super().update(instance, validated_data)
序列化程序.py

class CarPhoto(models.Model):
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, models.CASCADE)
    car = models.ForeignKey(Car, models.CASCADE, verbose_name=_('car'))
    category = models.CharField(
        max_length=255, choices=CATEGORY, null=True, blank=True)
    sub_category = models.CharField(max_length=255, null=True, blank=True)
    file = models.FileField(
        _("Upload documents image"), null=True, blank=True, upload_to=document_upload_to,
    )
class CarProfilePhotoView(RetrieveUpdateDestroyAPIView):
    parser_classes = [FileUploadParser]
    permission_classes = [OIsAuthenticated]
    serializer_class = serializers.PhotoCarSerializer

    def get_queryset(self):
        return models.Car.objects.filter(fleet__managers=self.request.user)

    def put(self, request, filename):
        request.user.profile = models.CarPhoto()
        request.user.profile.file.save(
            '%d.jpg' % request.user.profile.sub_category, request.data['file'])
        return Response({
            "file": request.build_absolute_uri(request.user.profile.file.url),
        })
class CarPhotoSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)
    file = serializers.SerializerMethodField()

    class Meta:
        model = models.CarPhoto
        exclude = ['created_by', 'car']

    def get_file(self, obj):
        if obj.file:
            return self.context['request'].build_absolute_uri(obj.file.url)

    def create(self, validated_data):
        validated_data['created_by'] = self.context['request'].user
        return super().create(validated_data)

class PhotoCarSerializer(serializers.ModelSerializer):
    car_photo = CarPhotoSerializer(
        many=True, source="carphoto_set", required=False
    )

    class Meta:
        model = models.Car
        fields = ["car_photo"]

def update(self, instance, validated_data):
        if 'carphoto_set' in validated_data:
            ids_set = [ndata['id']
                       for ndata in validated_data['carphoto_set'] if 'id' in ndata]
            instance.carphoto_set.exclude(id__in=ids_set).delete()
            for ndata in validated_data['carphoto_set']:
                if ndata.get('id'):
                    note = instance.carphoto_set.get(id=ndata['id'])
                    ndata.pop('id')
                else:
                    note = models.CarPhoto(
                        car=instance, created_by=self.context['request'].user)
                for k, v in ndata.items():
                    setattr(note, k, v)
                note.save()
            validated_data.pop('carphoto_set')

        return super().update(instance, validated_data)
解决方案已经结束,所以,还有更多的答案