在Django Rest框架中,使用枕头访问数据会在响应时损坏数据(您上载的文件不是图像或损坏的图像)

在Django Rest框架中,使用枕头访问数据会在响应时损坏数据(您上载的文件不是图像或损坏的图像),django,django-rest-framework,python-imaging-library,django-serializer,Django,Django Rest Framework,Python Imaging Library,Django Serializer,我想从序列化程序中上传的图像中提取格式和模式参数,并动态更新我的字段。这是代码 class ImageDataSerializer(serializers.ModelSerializer): class Meta: model = models.ImageData exclude = ['height','width'] 在我看来 serializer = serializer(data=request.data,partial=True) serializer

我想从序列化程序中上传的图像中提取格式模式参数,并动态更新我的字段。这是代码

class ImageDataSerializer(serializers.ModelSerializer):
class Meta:
    model = models.ImageData
    exclude = ['height','width']
在我看来

    serializer = serializer(data=request.data,partial=True)
    serializer.is_valid(raise_exception=True)
    obj = serializer.save(user=request.user,extension="PNG",image_type="RGB")     
    return Response(serializer.data) 
这很好用。我将我的InMemeoryUploadedFile实例作为我的数据发送,序列化程序将其保存到数据库中。但是,我想使用枕头库自动确定扩展名和图像类型。 这就是我到目前为止所尝试的

class ImageDataSerializer(serializers.ModelSerializer):
def __init__(self,*args,**kwargs):
    super(ImageDataSerializer,self).__init__(*args,**kwargs)
    myimage = self.initial_data['data']
    with Image.open(myimage) as myimage:
        self.fields['extension'].initial = myimage.format
        self.fields['image_type'].initial = myimage.mode
    # Update the extension and image_type initial values
class Meta:
    model = models.ImageData
    exclude = ['height','width']
发生的情况是,我的图像文件损坏,在响应中,我收到消息“上载有效图像。您上载的文件不是图像或损坏的图像。”
我还尝试确定视图中的扩展名和模式,并将其传递给request.data dictionary,但一旦使用Pillow.image.open()访问图像文件,就会破坏它

问题是光标。 使用Pizzle打开文件后,需要将光标重置到文件的开头,以便Django将来使用。下面是完整的工作代码

class ImageDataSerializer(serializers.ModelSerializer):
def __init__(self,*args,**kwargs):
    data = kwargs.get("data",None)
    img = data.get("data",None)
    with Image.open(img) as myimage:
        data['extension'] = myimage.format
        data['image_type'] = myimage.mode

    img.seek(0)       
    super(ImageDataSerializer,self).__init__(*args,**kwargs)



class Meta:
    model = models.ImageData
    exclude = ['height','width']
    read_only_fields = ['user']
seek(0)将光标重置为文件的开头