如何在 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?