将 QuerySet 作为 JSON 返回?
Posted
技术标签:
【中文标题】将 QuerySet 作为 JSON 返回?【英文标题】:Return QuerySet as JSON? 【发布时间】:2015-07-26 09:50:23 【问题描述】:我在 Django 1.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 与查询集一起使用的示例,这一定是最常见的用例。我试过这个:
results = PCT.objects.filter(code__startswith='a')
return JsonResponse(results, safe=False)
这给出了[<PCT: PCT object>, <PCT: PCT object>] is not JSON serializable
。
【问题讨论】:
Creating a JSON response using Django and Python 的可能副本 但肯定自 2010 年以来事情一定变得更简单了? 他们肯定有,并且在重复问题的第一个答案中引用了它。 好的,所以链接到这里:***.com/questions/2428092/…,它显示了如何使用 JSONResponse 返回字典。但我有一个 QuerySet,而不是字典。我正在尝试return JsonResponse(results.values(), safe=False)
,但这给了我一个TypeError: not JSON serializable
。有什么想法吗?
我真的不想变得困难,但考虑到转向前端应用程序,这似乎是人们可能想要在 Django 中做的最常见的事情之一:我很惊讶很难弄清楚该怎么做。
【参考方案1】:
无需任何额外框架的最简单解决方案:
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'], ...]
【讨论】:
如此接近!但是第一个 sn-p 给了我以下错误消息:['code': u'5M1', 'name': u'South Birmingham', 'code': u'5M3', 'name': u'Walsall Teaching'
] is not JSON serializable`.
这对我不起作用 :( 我得到一个 <PCT: PCT object> is not JSON serializable
和 return JsonResponse('results': list(results))
【参考方案2】:
使用 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
【讨论】:
谢谢,但与其他答案相同的问题:TypeError... is not JSON serializable
。
奇怪,它应该可以工作。 ***.com/questions/25798395/python-query-dict-to-json。也许尝试在值上调用 dict() 方法。【参考方案3】:
这些答案中的大多数都已过时。这是我使用的:
views.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)
views.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')
【讨论】:
【参考方案4】:看看Django's serialization framework。它不仅支持 XML 格式,还支持 JSON 和 YAML。
【讨论】:
谢谢,在阅读了那个页面后,我得到了data = serializers.serialize("json", results)
,然后是return data
,但这给了我一个关于Unicode的错误信息。是否缺少步骤?以上是关于将 QuerySet 作为 JSON 返回?的主要内容,如果未能解决你的问题,请参考以下文章
Django 将日期时间序列化为 QuerySet/Dict 中的 json