You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用serializers序列化模型返回JSON被转为字符串如何解决

问题原因

你调用django.core.serializers.serialize('json', 实例)的时候,得到的data已经是JSON格式的字符串了。而JsonResponse的作用是把Python原生对象(字典、列表等)序列化为JSON响应,所以你把JSON字符串传给它的话,它会对这个字符串做二次序列化,最终返回的就是带转义符的字符串格式结果,和你预期的不符。

解决方案

方案1:反序列化后再用JsonResponse返回

把serialize得到的JSON字符串先通过json.loads转成Python列表对象,再交给JsonResponse处理,修改view里的代码如下:

def infiniteScroll(request, room_name):
    dateFilter=request.GET.get('date')
    dateFilter=dateFilter[5:len(dateFilter)-4]
    dateFilter=datetime.strptime(dateFilter, '%d %b %Y %H:%M:%S')
    # 序列化得到JSON字符串
    json_str = serializers.serialize('json', reversed(Messages.objects.filter(room=room_name).filter(date_added__lt=dateFilter).order_by('-date_added')[:2]))
    # 转成Python原生列表对象
    data = json.loads(json_str)
    return JsonResponse(data, safe=False)

方案2:直接用HttpResponse返回序列化结果

既然已经拿到了合法的JSON字符串,直接作为响应体返回,指定响应头的内容类型为JSON即可,代码如下:

from django.http import HttpResponse

def infiniteScroll(request, room_name):
    dateFilter=request.GET.get('date')
    dateFilter=dateFilter[5:len(dateFilter)-4]
    dateFilter=datetime.strptime(dateFilter, '%d %b %Y %H:%M:%S')
    data=serializers.serialize('json', reversed(Messages.objects.filter(room=room_name).filter(date_added__lt=dateFilter).order_by('-date_added')[:2]))
    # 直接返回JSON字符串,指定内容类型
    return HttpResponse(data, content_type='application/json')

两种方案都可以得到你预期的JSON结构,第一种更符合Django返回JSON响应的常规写法,第二种性能略好,少了一次序列化/反序列化的过程。

内容的提问来源于stack exchange,提问作者Adi Putra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:15:03