You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:45:03