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

Django图片上传API返回null问题求助

Django图片上传API返回null问题排查

我在Django中编写了一个图片上传API,但该功能无法正常工作,上传图片时返回null,不清楚原因。现将相关代码及Postman返回结果截图提供如下,恳请帮忙排查问题,谢谢!

Models代码

class Slider(models.Model):
    image = models.ImageField(upload_to="images/")
    description = models.TextField()

Views代码

class UploadImage(viewsets.ModelViewSet):
    queryset = Slider.objects.all()
    serializer_class = SliderSerializer
    parser_classes = (MultiPartParser, FormParser)

def perform_create(self, request, *args, **kwargs):
    try:
        file = request.data["image"]
        title = request.data['description']
    except KeyError:
        raise ParseError('Request has no resource file attached')
    Slider.objects.create(image=file, description=title)

Serializers代码

class SliderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Slider
        fields = '__all__'

Urls代码

urlpatterns = [
    path('api/upload', views.UploadImage.as_view({'post': 'create'}), name='home')
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Postman返回结果截图

API返回结果


问题排查及解决方案

  1. 核心错误:perform_create方法缩进错误
    你定义的perform_create方法没有缩进在UploadImage类内部,导致ModelViewSet的默认create流程不会执行这个自定义逻辑,而是走默认的序列化保存,最终因流程异常返回null。

修正后的Views代码:

class UploadImage(viewsets.ModelViewSet):
    queryset = Slider.objects.all()
    serializer_class = SliderSerializer
    parser_classes = (MultiPartParser, FormParser)

    def perform_create(self, serializer):
        # 推荐使用DRF规范的serializer.save方法,自动处理字段映射
        serializer.save()
        
        # 若要保留自定义逻辑,需缩进在类内:
        # try:
        #     file = self.request.data["image"]
        #     description = self.request.data['description']
        # except KeyError:
        #     raise ParseError('Request has no resource file attached')
        # Slider.objects.create(image=file, description=description)
  1. 其他必要检查项
  • 确保settings.py中正确配置媒体文件路径:
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
  • 确认已安装Pillow库(Django的ImageField依赖该库):
pip install pillow
  • Postman请求需使用form-data格式,分别添加image(类型选File,上传目标图片)和description(类型选Text,输入描述文本)两个参数。

内容的提问来源于stack exchange,提问作者AbbasLotfinasab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:53:10