Django REST框架多图片上传视图实现问题,已有Model和Admin配置
实现Django多图上传REST接口的调整步骤
第一步:修正模型冗余字段(可选但建议)
你当前School模型中的school_images = models.FileField()是冗余字段,多图已经通过SchoolImage的外键关联存储,建议删掉该字段避免后续逻辑冲突。
第二步:编写嵌套序列化器
先在serializers.py中定义嵌套序列化器,处理学校和关联多图的映射关系:
from rest_framework import serializers from .models import School, SchoolImage class SchoolImageSerializer(serializers.ModelSerializer): class Meta: model = SchoolImage fields = ('id', 'schoolImages') class SchoolSerializer(serializers.ModelSerializer): # 读操作时返回关联的多图列表 school_images = SchoolImageSerializer(many=True, read_only=True) # 写操作时接收前端上传的多图数组 uploaded_images = serializers.ListField( child=serializers.ImageField(max_length=1000000, allow_empty_file=False, use_url=False), write_only=True ) class Meta: model = School fields = '__all__' def create(self, validated_data): # 提取上传的多图数据 images_data = validated_data.pop('uploaded_images') # 先创建学校主数据 school = School.objects.create(**validated_data) # 遍历生成关联的图片记录 for image_data in images_data: SchoolImage.objects.create(school=school, schoolImages=image_data) return school
第三步:调整视图代码
修改视图函数,增加文件解析器支持,同时修正错误状态码:
from rest_framework.response import Response from rest_framework.decorators import api_view, parser_classes from rest_framework import status from rest_framework.parsers import MultiPartParser, FormParser from .models import School from .serializers import SchoolSerializer @api_view(['GET','POST']) @parser_classes([MultiPartParser, FormParser]) # 新增解析器支持form-data格式的文件上传 def school_list(request): if request.method == 'GET': data = School.objects.all() serializer = SchoolSerializer(data, context={'request': request},many = True) return Response(serializer.data) elif request.method == 'POST': serializer = SchoolSerializer(data=request.data) if serializer.is_valid(): serializer.save() # 成功后返回创建完成的学校数据(包含多图信息) return Response(serializer.data, status=status.HTTP_201_CREATED) # 参数错误应该返回400而非404 return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
接口调用说明
前端请求时使用form-data格式提交:普通字段传入School模型的对应属性,多张图片都用uploaded_images作为字段名依次传入即可。
内容的提问来源于stack exchange,提问作者Sista-Night
相关产品推荐
相关产品推荐

