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:\env\first\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "D:\env\first\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "D:\env\first\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\env\first\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "D:\太原理工2018\代码\baizhi\tyut2018\PythonWeb\zx\DjangoProject01\home\views.py", line 52, in home_ajax
    "configurationlist":json.dumps(configuration_list),
  File "D:\python3.9\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "D:\python3.9\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "D:\python3.9\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "D:\python3.9\lib\json\encoder.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,问题解决。

猜你喜欢

转载自blog.csdn.net/qq_45956730/article/details/124622046
今日推荐