如何在 Django 中序列化(JSON)文件字段

Posted

技术标签:

【中文标题】如何在 Django 中序列化(JSON)文件字段【英文标题】:How to serialize(JSON) FileField in Django 【发布时间】:2017-12-16 02:45:32 【问题描述】:

我是 Django 新手,正在尝试构建一个应用程序来测试我的项目的一些内容。我想阅读表单 - 进行一些验证,然后将输入发送到另一个模块(比如单独运行的调度程序)。调度程序 rest api 将使用表单数据(即文件)调用,调度程序会将数据加载到模型中。在调用其余 api 之前,我正在使用 python 请求并将数据序列化为 json。这是我得到错误的地方。 Django on request.FILES 创建一个 InMemoryUploadedFile 类,该类将数据加载到内存中的某处并将其序列化为 Json 并不简单。我尝试寻找其他方式(如图像序列化程序示例)但无法解决此问题。

forms.py

class UploadDatasetForm(forms.Form):
    docfile = forms.FileField(label='Choose file')

views.py

def test_upload(request):
    if request.method == 'POST':
        form = UploadDatasetForm(request.POST, request.FILES)
        if form.is_valid():
            in_file = request.FILES['docfile']
            payload = 'doc_file': in_file
            msg = json.dumps(payload)
            URL = 'http://localhost:8880/form'
            r = requests.post(URL, data=msg)
    return HttpResponse(json.dumps(r.text), content_type="application/json")

错误:

raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <InMemoryUploadedFile: A_test.csv (text/csv)> is not JSON serializable

我们将不胜感激。非常感谢。

【问题讨论】:

您将一个表单发布到您的服务器,然后再次发布到另一个表单(REST API),该表单也在您的服务器上?为什么?为什么不能直接将其发布到 API 有什么原因? 【参考方案1】:

默认情况下,python 仅支持转换充满默认数据类型(str、int、float、dict、list 等)的手。您尝试转换 InMemoryUploadedFile,转储函数不知道如何处理。您需要做的是提供一种方法,将数据转换为 python 支持的数据类型之一。

class MyJsonEncoder(DjangoJSONEncoder):
    def default(self, o):
        if isinstance(o, InMemoryUploadedFile):
           return o.read()
        return str(o)


msg = json.dumps(payload, cls=MyJsonEncoder)

【讨论】:

【参考方案2】:

看起来您正在尝试序列化对 InMemoryUploadedFile 实例的引用 - 如果您只想 JSON 序列化数据而不是整个类实例,您可以读取数据。

替换:

payload = 'doc_file': in_file

payload = 'doc_file': in_file.read()

如果数据很大,您一定要使用 chunks():https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks

【讨论】:

以上是关于如何在 Django 中序列化(JSON)文件字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用视图集的情况下序列化 Django 中的注释字段?

如何将 Django queryset.values() 序列化为 json?

将大型 json 字符串从 Javascript 发布到 Django

从 django 序列化对象中删除 pk 字段

如何在 Django 中序列化模型实例?

Django Rest Framework:将嵌套 json 字段中的数据序列化为普通对象