如何使用Django Rest Framework (DRF) ModelViewSet实现base64转图片存储
DRF ModelViewSet 接收Base64图片的实现方案
你需要修改的核心是对应序列化器中的图片字段,无需调整ModelViewSet本身的核心逻辑,也不用依赖中间件修改请求参数
实现步骤
- 第一步:自定义支持Base64解析的图片字段,继承DRF原生的
serializers.ImageField
import base64 import uuid from django.core.files.base import ContentFile from rest_framework import serializers from .models import 你的图片模型类 # 替换为你自己的业务模型 class Base64ImageField(serializers.ImageField): def to_internal_value(self, data): # 匹配带前缀的标准base64图片格式 if isinstance(data, str) and data.startswith('data:image'): format_str, img_content = data.split(';base64,') file_ext = format_str.split('/')[-1] # 转成Django可识别的文件对象 data = ContentFile(base64.b64decode(img_content), name=f'{uuid.uuid4().hex}.{file_ext}') return super().to_internal_value(data)
- 第二步:替换序列化器中原有图片字段为自定义字段
class 你的图片序列化器(serializers.ModelSerializer): # 替换原本的ImageField为自定义的Base64ImageField 图片存储字段名 = Base64ImageField() class Meta: model = 你的图片模型类 fields = '__all__'
- 第三步:ModelViewSet直接绑定修改后的序列化器即可,无需额外调整
from rest_framework import viewsets class 你的图片视图集(viewsets.ModelViewSet): queryset = 你的图片模型类.objects.all() serializer_class = 你的图片序列化器
该方案在序列化层完成Base64到图片文件的转换,完全符合DRF的设计规范,无需修改不可变的QueryDict,也避免了中间件全局处理的额外开销。如果你的请求传入的Base64字符串没有
data:image前缀,调整自定义字段内的字符串拆分规则适配你的输入格式即可。
内容的提问来源于stack exchange,提问作者JohnShallow
相关产品推荐
相关产品推荐

