【问题标题】:Return QuerySet as JSON?将 QuerySet 作为 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

【问题讨论】:

  • 肯定自 2010 年以来事情一定变得更简单了?
  • 他们肯定有,并且在重复问题的第一个答案中引用了它。
  • 好的,所以链接到这里:stackoverflow.com/questions/2428092/…,它显示了如何使用 JSONResponse 返回字典。但我有一个 QuerySet,而不是字典。我正在尝试return JsonResponse(results.values(), safe=False),但这给了我一个TypeError: not JSON serializable。有什么想法吗?
  • 我真的不想变得困难,但考虑到转向前端应用程序,这似乎是人们可能想要在 Django 中做的最常见的事情之一:我很惊讶很难弄清楚该怎么做。

标签: json 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

【讨论】:

【解决方案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的错误信息。是否缺少步骤?
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多