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

ygu*_*guw 8 django serialization json django-forms django-views

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

forms.py

class UploadDatasetForm(forms.Form):
    docfile = forms.FileField(label='Choose file')
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

错误:

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

任何帮助将不胜感激.非常感谢.

zep*_*iyr 6

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

更换:

payload = {'doc_file': in_file}
Run Code Online (Sandbox Code Playgroud)

payload = {'doc_file': in_file.read()}
Run Code Online (Sandbox Code Playgroud)

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