Django REST框架文件JSON中的字段数据

cfh9epnr  于 2023-01-18  发布在  Go
关注(0)|答案(3)|浏览(165)

在Django REST框架(DRF)中,如何支持解序列化base64编码的二进制数据?
我有一个模型:

class MyModel(Model):
   data = models.FileField(...)

而且我希望能够以base64编码的方式发送此数据,而不是必须将表单数据分成多部分或“文件上传”。查看Parsers,似乎只有FileUploadParserMultiPartParser解析出文件。
我希望能够在JSON之类的东西发送此数据(即发送data中的二进制数据,而不是files

{
 'data':'...'
}
e0bqpujr

e0bqpujr1#

我通过创建一个新的Parser解决了这个问题:

def get_B64_JSON_Parser(fields):
    class Impl(parsers.JSONParser):
        media_type = 'application/json+b64'

        def parse(self, *args, **kwargs):
            ret = super(Impl, self).parse(*args, **kwargs)
            for field in fields:
                ret[field] = SimpleUploadedFile(name=field, content=ret[field].decode('base64'))
            return ret
    return Impl

然后我在View中使用它:

class TestModelViewSet(viewsets.ModelViewSet):
    parser_classes = [get_B64_JSON_Parser(('data_file',)),]
cwtwac6a

cwtwac6a2#

这是一个老问题,但是对于那些寻找最新解决方案的人来说,有一个DRF插件(drf_base64)可以处理这种情况,它允许在JSON请求中阅读编码为base64字符串的文件。
假设模型如下:

class MyModel(Model):
   data = models.FileField(...)

和一个预期的json,如:

{
  "data": "data:image/png;base64,iVBORw0KGgoA ....",
  ...
}

(des)序列化可以通过从drf_base模块而不是drf本身导入来处理。

from drf_base64.serializers import ModelSerializer
from .models import MyModel

class MyModel(ModelSerializer):

    class Meta:
        model = MyModel

请记住,使用FileReader API可以获得JavaScript中的base64编码文件。

rlcwz9us

rlcwz9us3#

在序列化器级别可能有一些聪明的做法,但首先想到的是在视图中进行。

步骤1:编写文件。类似于:

fh = open("/path/to/media/folder/fileToSave.ext", "wb")
fh.write(fileData.decode('base64'))
fh.close()

第2步:在模型上设置文件。类似于:

instance = self.get_object()
instance.file_field.name = 'folder/fileToSave.ext' # `file_field` was `data` in your example
instance.save()

请注意步骤1中的绝对路径和步骤2中的相对于介质文件夹的路径。
这至少可以让你走了。
理想情况下,您可以将其指定为一个序列化器字段,并免费获得模型示例的验证和自动赋值,但乍一看,这似乎很复杂。

相关问题