我想从序列化器中上传的图像中提取 format 和 mode 参数,并动态更新我的字段。这是代码...
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 实例作为数据,而序列化程序将其保存到数据库中。但是,我想使用Pillow库自动确定扩展名和image_type。 到目前为止,这是我尝试过的...
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字典,但是使用Pillow.Image.open()一次访问图像文件会损坏它。
答案 0 :(得分:0)
问题是光标。 使用Pillow打开文件后,您需要将光标重置到文件的开头,以供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']
img.seek(0)将光标重置到文件的开头