【问题标题】:How can I JSON serialize a queryset on Django?如何 JSON 序列化 Django 上的查询集?
【发布时间】:2017-11-28 03:12:45
【问题描述】:

我想在我的 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)

【问题讨论】:

  • here。如果还不够,您可以随时根据需要创建手动字典。另外,你必须使用JsonResponse,扔掉第二个。
  • 你能发布你的序列化器和模型。同样在你的第三次尝试什么是tmp_backgrounds
  • 在序列化程序中,将tmp_fonts 替换为Font.objects.all()(或其他任何内容)。应该使用 QuerySet,而不是列表。
  • 添加到@RompePC 评论我建议创建一个序列化程序来序列化模型的对象。
  • @ArpitSolanki +1

标签: json ajax django


【解决方案1】:

所以简短的版本是:

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

【讨论】:

    【解决方案2】:

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

    # tmp_fonts = [<Font:CaviarDream>, <Font:Arial>, <Font:Calibri>, etc...]
    
    response = JsonResponse({
        'foo' : serializers.serialize('json', tmp_fonts),
    })
    
    return HttpResponse(response, content_type='application/json')
    

    【讨论】:

    • 你可以忘记 HttpResponse。只需返回 JsonResponse。 JSonResponse 是具有正确内容类型的 HttpResponse,它使用 JSONEncoder 将其输入作为字典转换为 Json。所以它仍然是一个 HttpResponse。
    猜你喜欢
    • 2021-12-27
    • 2013-11-02
    • 2012-09-12
    • 2021-09-15
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2021-12-26
    相关资源
    最近更新 更多