如何在Django上JSON序列化queryset?

如何在Django上JSON序列化queryset?,json,ajax,django,Json,Ajax,Django,我想在ajax响应中返回一个queryset,这是我尝试序列化queryset时遇到的错误 TypeError:“Font:FontName”不可JSON序列化 我使用JSON响应,如下所示: ... return JsonResponse({ 'foo': Font.objects.filter(id=1).first(), }) 我也试过了,同样的错误: response = json.dumps({ 'foo' : tmp_fonts, }) return HttpR

我想在ajax响应中返回一个queryset,这是我尝试序列化queryset时遇到的错误

TypeError:“Font:FontName”不可JSON序列化

我使用JSON响应,如下所示:

...
return JsonResponse({
    'foo': Font.objects.filter(id=1).first(),
})

我也试过了,同样的错误:

response = json.dumps({
    'foo' : tmp_fonts,
})

return HttpResponse(response, content_type='application/json')

第三次尝试:

class UserInfo(models.Model):
    organisation = models.CharField(max_length=255)
    font = models.ManyToManyField(Font)

class Font(models.Model):
    name = models.CharField(max_length=255)
AttributeError:“str”对象没有属性“\u meta”


解决方案:这就是列表中查询集的工作原理

# tmp_fonts = [<Font:CaviarDream>, <Font:Arial>, <Font:Calibri>, etc...]

response = JsonResponse({
    'foo' : serializers.serialize('json', tmp_fonts),
})

return HttpResponse(response, content_type='application/json')
#tmp#U字体=[、等..]
response=JsonResponse({
“foo”:序列化程序。序列化('json',tmp_字体),
})
返回HttpResponse(响应,content\u type='application/json')

解决方案:这就是列表中查询集的工作原理

# tmp_fonts = [<Font:CaviarDream>, <Font:Arial>, <Font:Calibri>, etc...]

response = JsonResponse({
    'foo' : serializers.serialize('json', tmp_fonts),
})

return HttpResponse(response, content_type='application/json')
#tmp#U字体=[、等..]
response=JsonResponse({
“foo”:序列化程序。序列化('json',tmp_字体),
})
返回HttpResponse(响应,content\u type='application/json')

因此短版本是:

from django.http import JsonResponse
from django.views import generic
from .models import Font


class FontListAjaxView(generic.View):
    def get(self, *args, **kwargs):
        return JsonResponse(data=list(Font.objects.values()), safe=False)
        # or the "safe" version, where data needs to be dictionary:
        # return JsonResponse(data={'data': list(Font.objects.values()))

因此,简短的版本是:

from django.http import JsonResponse
from django.views import generic
from .models import Font


class FontListAjaxView(generic.View):
    def get(self, *args, **kwargs):
        return JsonResponse(data=list(Font.objects.values()), safe=False)
        # or the "safe" version, where data needs to be dictionary:
        # return JsonResponse(data={'data': list(Font.objects.values()))

看。如果还不够的话,你可以把你需要的东西装进一个手动听写器里。另外,你必须使用
JsonResponse
,扔掉第二个。你能发布你的序列化程序和模型吗。另外,在第三次尝试序列化程序中的
tmp\u背景
时,将
tmp\u字体
替换为
Font.objects.all()。支持使用查询集,而不是列表。若要添加到@RompePC comment,我建议创建一个序列化程序来序列化模型的对象。@arpitolanki+1Look。如果还不够的话,你可以把你需要的东西装进一个手动听写器里。另外,你必须使用
JsonResponse
,扔掉第二个。你能发布你的序列化程序和模型吗。另外,在第三次尝试序列化程序中的
tmp\u背景
时,将
tmp\u字体
替换为
Font.objects.all()。支持使用查询集,而不是列表。添加到@RompePC comment中,我建议创建一个序列化程序来序列化模型的对象。@Arpitolanki+1您可以忘记HttpResponse。只需返回JsonResponse。JSonResponse是具有正确内容类型的HttpResponse,它使用JSONEncoder将输入作为一个词汇表接受,并将其转换为Json。所以它仍然是一个HttpResponse。你可以忘记HttpResponse。只需返回JsonResponse。JSonResponse是具有正确内容类型的HttpResponse,它使用JSONEncoder将输入作为一个词汇表接受,并将其转换为Json。所以它仍然是一个HttpResponse。