我是靠谱客的博主 清爽路灯,最近开发中收集的这篇文章主要介绍django之 TypeError: Object of type QuerySet is not JSON serializable,json 不能将QuertSet序列化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在启动django框架运行之后,我进行对http://127.0.0.1:8000/home/query/地址的访问,这个页面中使用了ajax请求,本来是通过ajax请求路口到后端,然后后端从数据库中查找数据再返回到前端。

我在项目的app里的views.py文件中的关于ajax请求的函数是这样写的:

@csrf_exempt
def home_ajax(request):
    """从前端ajax接收数据,处理之后再传递到前端生成数据可视化图"""
    print(dict(request.POST))
    if request.POST['road_id'] == 0:
    # 请选择所在的路口名称!
        return redirect(reverse("home_query") + "?errinfo=1")

    data_list = dict(request.POST)  # 转为字典格式
    # 在数据库中查找相应的路口
    road = Effect.objects.get(road_id=data_list['road_id'][0]).toDict()
    # backbone_list = Backbone.objects.filter(backbone_id=road[0].backbone_id)
    # backbone_optimized_list = BackboneOptimized.objects.filter(backbone_id=road.backbone_id)
    configuration_list =serializers.serialize("json", Configuration.objects.filter(effect_id=data_list['road_id'][0]))
    summary_list = serializers.serialize("json", Summary.objects.all())
    summary_optimized_list = serializers.serialize("json", SummaryOptimized.objects.all())
    print(type(road))
    print(json.dumps(road))
    # print(backbone_list)
    print(summary_list)
    print(summary_optimized_list)
    print(configuration_list)
    result = {
        "status": True,
        "data": {
            "road":road,
            "configurationlist":configuration_list,
            # # "backbonelist":backbone_list,
            # # "backboneOptimizedlist": backbone_optimized_list,
            "summarylist":summary_list,
            "summaryOptimizedlist":summary_optimized_list,
        }
    }
    return JsonResponse(result)

正常情况下,应该会在console中打印传送过来的数据信息。但是出现了一个错误:TypeError: Object of type QuerySet is not JSON serializable,json 不能将QuertSet序列化

我右击“检查”打开浏览器源码,在console中发现html文件中出现了ajax返回数据失败,这是为什么呢?

而且在PyCharm里也报错了:

Internal Server Error: /home/ajax/
Traceback (most recent call last):
  File "D:envfirstlibsite-packagesdjangocorehandlersexception.py", line 34, in inner
    response = get_response(request)
  File "D:envfirstlibsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "D:envfirstlibsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:envfirstlibsite-packagesdjangoviewsdecoratorscsrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "D:太原理工2018代码baizhityut2018PythonWebzxDjangoProject01homeviews.py", line 52, in home_ajax
    "configurationlist":json.dumps(configuration_list),
  File "D:python3.9libjson__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "D:python3.9libjsonencoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "D:python3.9libjsonencoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "D:python3.9libjsonencoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type QuerySet is not JSON serializable

解决思路: 

(1)其中,最主要的错误是最后一句,现在的问题是:json 不能将QuertSet序列化。

TypeError: Object of type QuerySet is not JSON serializable

我输出了一下model.object.filter()和model.object.all()返回的结果确实是QuerySet对象:

 (2)是因为我的函数里写的Effect.object.get()这个返回的是字典类型的,就可以被json包序列化 

但是model.object.filter()和model.object.all()不行,报错了,因为它们返回的是一个QuerySet对象。而QuerySet对象不能被json序列化。

 (3)那么,我们导入下面这个包serializes试试,

from django.core import serializers

data = serializers.serialize("json", SomeModel.objects.all())

data1 = serializers.serialize("json", SomeModel.objects.filter(myfield1=myvalue))

 (4)改好之后,再次重启django项目之后,发现这个报错问题消失了,好了,问题成功解决。

 而且PyCarm也没有报错了:

  OK,问题解决。

最后

以上就是清爽路灯为你收集整理的django之 TypeError: Object of type QuerySet is not JSON serializable,json 不能将QuertSet序列化的全部内容,希望文章能够帮你解决django之 TypeError: Object of type QuerySet is not JSON serializable,json 不能将QuertSet序列化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部