django 是否将QuerySet返回为JSON?

lokaqttq  于 2023-01-21  发布在  Go
关注(0)|答案(5)|浏览(162)

我正在Django1.8中工作,但很难找到现代的方法来完成这项工作。
这是我得到的,基于谷歌搜索和this blog post

results = PCT.objects.filter(code__startswith='a')
json_res = []
for result in results:
    json_res.append(result.as_dict())
return HttpResponse(json.dumps(json_res), content_type='application/json')

但是,这会得到'PCT' object has no attribute 'as_dict'
现在肯定有更好的办法了吧?
我想知道是否有可能使用JSONResponse,但令人沮丧的是,文档没有给予如何使用JSONRespose和queryset的示例,这肯定是最常见的用例。

results = PCT.objects.filter(code__startswith='a')
return JsonResponse(results, safe=False)

这样就得到了[<PCT: PCT object>, <PCT: PCT object>] is not JSON serializable

vu8f3i0k

vu8f3i0k1#

最简单的解决方案,无需任何附加框架:

results = PCT.objects.filter(code__startswith='a').values('id', 'name')
return JsonResponse({'results': list(results)})

返回{'results': [{'id': 1, 'name': 'foo'}, ...]}
或者如果您只需要值:

results = PCT.objects.filter(code__startswith='a').values_list('id', 'name')
return JsonResponse({'results': list(results)})

返回{'results': [[1, 'foo'], ...]}

7gyucuyw

7gyucuyw2#

使用values()返回一个查询字典,并将其传递给json.dumps

values = PCT.objects.filter(code__startswith='a').values()
return HttpResponse(json.dumps(values), content_type='application/json')

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#values

qmelpv7a

qmelpv7a3#

这些答案大多已经过时了,我用的是:

视图.py(返回HTML)

from django.shortcuts import render
from django.core import serializers

def your_view(request):
    data = serializers.serialize('json', YourModel.objects.all())
    context = {"data":data}
    return render(request, "your_view.html", context)

视图.py(返回JSON)

from django.core import serializers
from django.http import HttpResponse

def your_view(request):
    data = serializers.serialize('json', YourModel.objects.all())
    return HttpResponse(data, content_type='application/json')
egdjgwm8

egdjgwm84#

看看Django's serialization framework,它不仅支持XML格式,还支持JSON和YAML。

7fyelxc5

7fyelxc55#

使用JsonResponseaccepted answer很好也很简单,但是它不返回完整的对象。
另一种方法是使用Django的serializers,下面是一个从管理操作文档中逐字复制的示例:

...
   response = HttpResponse(content_type="application/json")
   serializers.serialize("json", queryset, stream=response)
   return response

这与Django的JsonResponse非常相似,可以在源代码中看到。
主要区别在于JsonResponse直接调用json.dumps(),并且不知道如何处理查询集,而上面的示例使用serializers.serialize('json', ...),它知道如何处理查询集,并且返回完整的对象,这些对象也可以在以后反序列化。
如果要直接保存到文件(使用content-disposition: attachment在浏览器中打开保存对话框),可以使用FileResponse,例如:

...
    data = serializers.serialize('json', queryset)
    return FileResponse(
        io.BytesIO(data.encode('utf-8')),
        content_type='application/json',
        as_attachment=True,
        filename=f'{queryset.model.__name__.lower()}-objects.json'
    )

相关问题