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

Django DRF上传图片后picture字段返回null且未存储问题求助

问题根因

你重写了序列化器的save()方法,但没有执行父类的保存逻辑,仅修改了validated_data属性,没有触发数据库写入和文件落盘操作,同时代码存在缩进错误,导致类成员定义不生效。

解决步骤

  1. 修正序列化器的缩进错误,将save()方法、Meta类调整为PictureSerializer的内部成员
  2. 在自定义save()方法的末尾调用父类ModelSerializer的save()方法,传入处理完成的validated_data,触发实际的存储逻辑
  3. 补充检查项目基础配置,确保文件上传依赖正常

修正后的序列化器参考代码

import re
import sys
import urllib.request
from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
from rest_framework import serializers
from .models import Picture

class PictureSerializer(serializers.ModelSerializer):
    @staticmethod
    def name_parser(object_name):
        parser = re.search(r'[^/]*$', str(object_name))
        return parser[0]

    # 缩进修正:save方法是类的内部方法
    def save(self, **kwargs):
        if 'picture' not in self.validated_data.keys():
            url = self.validated_data['url']
            result = urllib.request.urlopen(url=url)
            img = BytesIO(result.read())
            converted_img = InMemoryUploadedFile(img, None, self.name_parser(url),
                                                 'image/jpeg', sys.getsizeof(img), None)
            self.validated_data.update({'picture': converted_img})
        if 'pic_name' not in self.validated_data.keys():
            name = self.name_parser(self.validated_data['picture'])
            self.validated_data.update({'pic_name': name})
        # 调用父类save方法,触发数据库写入和文件保存,返回创建的实例
        return super().save(**kwargs)

    # 缩进修正:Meta类是序列化器的内部类
    class Meta:
        model = Picture
        fields = ('id', 'pic_name', 'picture', 'url', 'width', 'height')

补充检查项

  • 确认settings.py中已配置媒体资源路径:
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
  • 确认项目根路由已配置媒体资源访问路径:
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 你的原有路由
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  • 确认已安装图片处理依赖Pillow,可执行pip install pillow安装
  • 确认Postman提交请求时使用form-data格式,上传文件的字段名与序列化器picture字段一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:30:05