在 Django 中返回 JSON 响应

Posted

技术标签:

【中文标题】在 Django 中返回 JSON 响应【英文标题】:Returning JSON Response in Django 【发布时间】:2017-10-09 19:06:21 【问题描述】:

我正在尝试从查询中返回 JSON 响应。我见过诸如 (https://rayed.com/wordpress/?p=1508) 之类的示例,但它们不包含传递 html 模板。我收到一条错误消息“字典更新序列元素 #0 的长度为 510;需要 2”

型号

class APCPlats(models.Model):
PlatsProjected = models.IntegerField(db_column='Projected', blank=True, null=True)
PlatsCompleted = models.IntegerField(db_column='Complete', blank=True, null=True)
Month = models.CharField(db_column='Month', max_length=200 , blank=True, null=True)

def __str__(self):
    return self.Month

class Meta:
    managed = True
    db_table = 'APCPlats'

查看

def APCChart(request):
   apcdata = APCPlats.objects.all()
   apcchart = serializers.serialize('json', apcdata)

   return render(request, 'apc.html', JsonResponse(apcchart, safe=False))

解决方案:

创建以下类:

class DecimalJSONEncoder(json.JSONEncoder):
def default(self, o):
    if type(o) == Decimal:
        # Here You can decide if You want decimal to be converted
        # to string or float.
        return float(o)
    if isinstance(o, datetime.datetime):
        #return o.replace(tzinfo=None).isoformat()
        return datetime.datetime.strftime(o, "%Y/%m/%d")
    return super(DecimalJSONEncoder, self).default(o)

如何在您的查询集上使用该类:

json_data = json.dumps(queryset, cls=DecimalJSONEncoder)

确保您导入以下内容:

from django.core.serializers.json import DjangoJSONEncoder

【问题讨论】:

您为什么要尝试使用带有 JSON 的 HTML 模板?您是否尝试将 HTML 作为 JSON 返回? HTML中的JSON?预期的结果是什么? Django view returning json without using template的可能重复 @kichik 我不久前解决了这个问题。我需要将 Django 中的查询转换为 JSON 以传递到谷歌图表 API。现在一切都很好。 【参考方案1】:

我了解到您正在尝试使用 ajax 将查询集返回到前端。如果是这种情况,你不需要渲染,你所需要的只是 Jsonresponse 之类的:

return JsonResponse(appchart, safe=False)

【讨论】:

阐述解决方案... jason_data = json.dumps(list(queryset), cls=DecimalJSONEncoder)

以上是关于在 Django 中返回 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应

python 将Django QuerySet作为JSON响应返回的示例(Django 1.7)

Django中使用JSON返回数据

如何在 django 中返回这个 JSON 而不会被转义?

如何在 django ajax 更新中返回 json 字典

如何覆盖与响应 django rest framework 序列化程序一起返回的返回序列化程序对象