在 Django 1.7 中使用 JSONResponse 序列化 QuerySet?

Posted

技术标签:

【中文标题】在 Django 1.7 中使用 JSONResponse 序列化 QuerySet?【英文标题】:Use JSONResponse to serialize a QuerySet in Django 1.7? 【发布时间】:2014-12-10 00:36:07 【问题描述】:

我看到现在在 Django 1.7 中我可以使用 http.JSONResponse 对象将 JSON 发送到客户端。我的观点是:

#Ajax
def get_chat(request):
    usuario = request.GET.get('usuario_consultor', None)
    usuario_chat = request.GET.get('usuario_chat', None)

    mensajes = list(MensajeDirecto.objects.filter(Q(usuario_remitente = usuario, usuario_destinatario = usuario_chat) | Q(usuario_remitente = usuario_chat, usuario_destinatario = usuario)))


    return JsonResponse(mensajes, safe=False)

但我得到下一个错误:

不是 JSON 可序列化的`

您知道如何序列化 QuerySet 以将其以 JSON 形式发回吗?

【问题讨论】:

查看此链接***.com/questions/26067369/… 【参考方案1】:

您不应使用JsonResponse 重新序列化。您将获得格式正确的 JSON 响应:

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

def my_view(request):
    my_model = MyModel.objects.all()
    response = serializers.serialize("json", my_model)
    return HttpResponse(response, content_type='application/json')

如果您使用JsonResponse,它会将已经序列化的 JSON 强制转换为字符串,这可能不是您想要的。

注意:适用于 Django 1.10

【讨论】:

在 django 1.11 上像魅力一样工作 还有 Django 2。谢谢! 最佳答案。 JsonResponse 出现错误。它以字符串形式返回给我。【参考方案2】:
from django.core import serializers
from django.http import JsonResponse

def get_chat(request):
    usuario = request.GET.get('usuario_consultor', None)
    usuario_chat = request.GET.get('usuario_chat', None)

    mensajes = MensajeDirecto.objects.filter(Q(usuario_remitente = usuario, usuario_destinatario = usuario_chat) | Q(usuario_remitente = usuario_chat, usuario_destinatario = usuario))

    return JsonResponse(serializers.serialize('json', mensajes), safe=False)

参考: https://docs.djangoproject.com/en/dev/ref/request-response/#jsonresponse-objects https://docs.djangoproject.com/en/1.7/topics/serialization/

【讨论】:

我们也可以用HttpResponse代替JsonResponse:return HttpResponse(serializers.serialize('json', mensajes)) @jatin 您确实想使用 JsonResponse 来确保 Content-Type 标头设置为 application/json return JsonResponse(serializers.serialize('json', data), safe=False) 返回 JSON 字符串而不是 JSON...return HttpResponse(serializers.serialize('json', data), content_type="application/json") 作品出售。 @Arst JsonResponse 是 HttpResponse 的子类,content_type 参数已预设为 application/json。因此,使用 HttpResponse 本质上是手动构建类似的结果。如果没有设置标题,也许会寻找另一个原因。来源:docs.djangoproject.com/en/1.10/ref/request-response/… @Arst 是正确的。如果你使用JsonResponse,你实际上是在重新序列化一个已经是 JSON 的字符串。请参阅下面的答案。

以上是关于在 Django 1.7 中使用 JSONResponse 序列化 QuerySet?的主要内容,如果未能解决你的问题,请参考以下文章

测试中的模型 - Django 1.7 问题

Django 1.7 中的迁移

Django 1.7 中的 Django-migrations 检测模型更改,但不会在迁移时应用它们

Django 1.7 内置迁移与南迁移?

Django 1.7 空白 CharField/TextField 约定

Django 1.7 vs Django1.6 vs Django 1.5 [关闭]