我怎样才能JSON序列化Django上的查询集?

时间:2017-06-24 19:16:37

标签: json ajax django

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

  

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')

第三次尝试:

  

AttributeError:'str'对象没有属性'_meta'

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

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

我希望能够在响应时将其恢复,并在我的模板上显示查询中的每个字段。这甚至可能吗?

型号:

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

class Font(models.Model):
    name = models.CharField(max_length=255)

2 个答案:

答案 0 :(得分:2)

所以简短版本是:

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()))

答案 1 :(得分:0)

解决方案:这适用于列表中的查询集。

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

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

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