将 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 serializablereturn 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 返回?的主要内容,如果未能解决你的问题,请参考以下文章

将 Queryset 转换为带有 JSON 值的字典

在 Django 中将 QuerySet 转换为 JSON

我模型上的过滤器函数返回我 <QuerySet []>

Django 将日期时间序列化为 QuerySet/Dict 中的 json

如何将 Django queryset.values() 序列化为 json?

Django:将带有相关对象的 QuerySet 转换为 JSON