Django DRF上传图片后picture字段返回null且未存储问题求助
问题根因
你重写了序列化器的save()方法,但没有执行父类的保存逻辑,仅修改了validated_data属性,没有触发数据库写入和文件落盘操作,同时代码存在缩进错误,导致类成员定义不生效。
解决步骤
- 修正序列化器的缩进错误,将
save()方法、Meta类调整为PictureSerializer的内部成员 - 在自定义
save()方法的末尾调用父类ModelSerializer的save()方法,传入处理完成的validated_data,触发实际的存储逻辑 - 补充检查项目基础配置,确保文件上传依赖正常
修正后的序列化器参考代码
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
相关产品推荐
相关产品推荐

