json 的 Django 问题:'tuple' 对象没有属性 '_meta'

我正在尝试将查询集中的数据导出为不同的文件格式,但我遇到了 json 格式的问题。


这是我的一小段代码:


from django.core import serializers


def export_categories_json(request):


    with open("categories.json", "w") as out:

        data = serializers.serialize("json", Category.objects.all().values_list('id', 'name'))

        out.write(data)

然后,我在模板中设置了一个按钮,该按钮调用此函数并应下载 json 文件。但我有这个问题:


Traceback:


File "/home/val/.pyenv/versions/Publication3.6.2/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner

  41.             response = get_response(request)


File "/home/val/.pyenv/versions/Publication3.6.2/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response

  187.                 response = self.process_exception_by_middleware(e, request)


File "/home/val/.pyenv/versions/Publication3.6.2/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response

  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)


File "/home/val/Bureau/Projets/Publication/publication/src/web/views/exports.py" in export_categories_json

  276.         data = serializers.serialize("json", Category.objects.all().values_list('id', 'name'))


File "/home/val/.pyenv/versions/Publication3.6.2/lib/python3.6/site-packages/django/core/serializers/__init__.py" in serialize

  129.     s.serialize(queryset, **options)


File "/home/val/.pyenv/versions/Publication3.6.2/lib/python3.6/site-packages/django/core/serializers/base.py" in serialize

  84.             concrete_model = obj._meta.concrete_model


Exception Type: AttributeError at /Category/json

Exception Value: 'tuple' object has no attribute '_meta'

我的代码有问题吗?我无法将查询集发送到 json 文件?


摇曳的蔷薇
浏览 383回答 3
3回答

白衣非少年

请不要不自己做系列化:Django的有一些内置serializiation功能,并且你也可以继承串行改变其行为。您的观点也并没有返回一个HTTP响应,但是这是应该满足合同(以及它应该返回一个HTTP响应,或者应该提出一些错误)。相反,您将内容写入文件,但写入文件通常不是一个好主意(除非您预计文件会很大,在这种情况下您可以使用临时文件)。通过使用文件,您会创建竞争条件,黑客还可能旨在“注入”不同的文件名,从而覆盖某些文件以运行任意代码或更改凭据,最后可能服务器具有某些权限使其无法写入文件(目录的权限)。Django 允许您将 HTTP 响应视为流对象,内容可以写入其中,例如:from django.http import HttpResponsefrom django.core import serializersdef export_categories_json(request):    response = new HttpResponse(content_type='application/json')    response['Content-Disposition'] = 'attachment;filename=categories.json'    serializers.serialize(        'json',        Category.objects.all(),        fields=['name'],        stream=response    )    return response

月关宝盒

如果要将某些内容的 json 表示写入文件,请使用json.dump:import jsonfrom django.shortcuts import redirectdef export_to_json(request):    with open('export.json', 'w') as f:       json.dump(list(Category.objects.all().values_list('id', 'name')), f)    return redirect('/')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python