为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2021-06-30 14:00:01
我正在尝试将查询集中的数据导出为不同的文件格式,但我遇到了 json 格式的问题。这是我的一小段代码:from django.core import serializersdef 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_modelException Type: AttributeError at /Category/jsonException Value: 'tuple' object has no attribute '_meta'我的代码有问题吗?我无法将查询集发送到 json 文件?
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

请不要不自己做系列化:Django的有一些内置serializiation功能,并且你也可以继承串行改变其行为。


您的观点也并没有返回一个HTTP响应,但是这是应该满足合同(以及它应该返回一个HTTP响应,或者应该提出一些错误)。


相反,您将内容写入文件,但写入文件通常不是一个好主意(除非您预计文件会很大,在这种情况下您可以使用临时文件)。通过使用文件,您会创建竞争条件,黑客还可能旨在“注入”不同的文件名,从而覆盖某些文件以运行任意代码或更改凭据,最后可能服务器具有某些权限使其无法写入文件(目录的权限)。


Django 允许您将 HTTP 响应视为流对象,内容可以写入其中,例如:


from django.http import HttpResponse

from django.core import serializers


def 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


查看完整回答
反对 回复 2021-07-13
?
月关宝盒

TA贡献1772条经验 获得超5个赞

如果要将某些内容的 json 表示写入文件,请使用json.dump:


import json


from django.shortcuts import redirect


def export_to_json(request):

    with open('export.json', 'w') as f:

       json.dump(list(Category.objects.all().values_list('id', 'name')), f)

    return redirect('/')


查看完整回答
反对 回复 2021-07-13
  • 3 回答
  • 0 关注
  • 382 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号