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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:39:01