Javascript 如何在ajax httpresponse中返回django查询集

Javascript 如何在ajax httpresponse中返回django查询集,javascript,ajax,django,Javascript,Ajax,Django,我一直在尝试检索Django queryset,并通过Ajax将其存储在Javascript变量中 我目前正在尝试使用下面的代码,但我不断收到“Queryset不可JSON序列化。我对django和JSON格式都很陌生。我如何解决这个问题?” html/javascript页面 $.ajax({url: "http://127.0.0.1:8000/getPorts, success: function(result){ var res = JSON.parse(resu

我一直在尝试检索Django queryset,并通过Ajax将其存储在Javascript变量中

我目前正在尝试使用下面的代码,但我不断收到“Queryset不可JSON序列化。我对django和JSON格式都很陌生。我如何解决这个问题?”

html/javascript页面

$.ajax({url: "http://127.0.0.1:8000/getPorts,
    success: function(result){
        var res = JSON.parse(result);
    }
});
views.py

def getPorts(request):
    JSONer = {} 
    ports = Port.objects.all()

    JSONer['ports'] = ports

    return HttpResponse(json.dumps(JSONer))

另外,如果有人想建议一种更好的使用ajax向视图发送/检索数据的方法,我愿意听取您的建议。谢谢您

您也可以使用内置的
JsonResponse
,这样您就不必调用
json.dumps()
,它还可以设置正确的头

首先是JavaScript代码:

$.ajax({
  url: '/getPorts',
  dataType: 'json',
  sucess: function (result) {
    console.log(result.ports);
  }
});
通过设置
数据类型
,您已经得到了一个已解析的对象。此外,您不需要在
url
参数中对绝对url进行硬处理

那么,在你看来:

from django.http import JsonResponse

def getPorts(request):
    JSONer = {} 
    ports = Port.objects.values()
    JSONer['ports'] = ports
    return JsonResponse(JSONer)

在将queryset发送回ajax之前,可以尝试序列化它,如下所示:

from django.core import serializers
data = serializers.serialize('json', list(ports))

您可以如上所示指定所需字段。

简短回答:您不需要

请理解,
queryset
不是实际的可序列化数据。它们只是帮助从数据库中查询该数据


正如其他人所指出的,只需使用
JsonResponse
或手动转储为as
json
并将其发送到
HttpResponse

中,将其转换为json响应即可尝试
JSONer['ports']=list(ports.values())