如何在Django中序列化(JSON)FileField

时间:2017-07-11 21:22:47

标签: json django serialization django-forms django-views

我是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

这里的任何帮助将不胜感激。非常感谢。

2 个答案:

答案 0 :(得分:4)

看起来您正在尝试序列化对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

答案 1 :(得分:3)

默认情况下,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)