Django DRF ModelViewSet多图上传报InMemoryUploadedFile错误如何解决
问题原因
你遇到的报错是因为嵌套序列化器默认期望接收字典格式的结构化数据,无法直接解析二进制上传的文件对象,同时你的序列化器create方法逻辑顺序也存在错误,具体修复步骤如下:
修复步骤
1. 调整模型反向关联字段名(可选但推荐)
ProductImage模型中related_name设置为image语义不准确,也容易和序列化器自定义字段冲突,建议修改为images:
class ProductImage(Core): product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='images') image = models.ImageField(upload_to=path_and_rename)
2. 重写ProductSerializer字段与创建逻辑
不能直接用ProductImageSerializer作为写入字段接收上传文件,改为用ListField套ImageField接收多图,同时单独配置读取时的嵌套序列化输出:
class ProductSerializer(ModelSerializer): # 写入用:接收多个图片文件,仅写入时生效 image = serializers.ListField( child=serializers.ImageField(allow_empty_file=False), required=True, write_only=True ) # 读取用:返回序列化后的图片列表,仅读取时生效 images = ProductImageSerializer(many=True, read_only=True) class Meta: model = Product fields = '__all__' def create(self, validated_data): # 先弹出图片数据,再创建商品,避免主表模型找不到image字段报错 image_list = validated_data.pop('image') product = Product.objects.create(**validated_data) # 批量创建关联图片记录 ProductImage.objects.bulk_create([ ProductImage(product=product, image=img) for img in image_list ]) return product
原有代码逻辑错误说明:你先调用
Product.objects.create(**validated_data)再弹出image字段,此时validated_data包含image参数,但Product模型本身没有该字段,会直接触发字段不存在报错。
3. Postman调用配置
- 请求头不需要手动设置
Content-Type,Postman会自动携带正确的multipart/form-data标识 - Body选择
form-data格式,多次添加key为image的项,类型选择File,每次选择不同的图片即可,不需要给key加[]后缀
常见校验规则补充
如果需要限制单张图片大小、格式等,可以在ImageField中添加校验规则:
from rest_framework.validators import ValidationError def validate_image_size(image): if image.size > 1024 * 1024 * 5: # 限制5M以内 raise ValidationError("图片大小不能超过5M") # 字段中引用校验器 image = serializers.ListField( child=serializers.ImageField(allow_empty_file=False, validators=[validate_image_size]), required=True, write_only=True )
内容的提问来源于stack exchange,提问作者Anish Neupane
相关产品推荐
相关产品推荐

