首页 > 解决方案 > Django TypeError:用户类型的对象不是 JSON 可序列化的

问题描述

所以我试图在 django 中进行 ajax 调用,但这发生了

Internal Server Error: /ajax/new_notification/
Traceback (most recent call last):
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\berna\Desktop\Python & Javascript\Web development\MiFamiliaEsUnDesastre\mifamiliaesundesastre\chat\views.py", line 71, in new_notification
    return JsonResponse(user, safe=False)
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\http\response.py", line 561, in __init__
    data = json.dumps(data, cls=encoder, **json_dumps_params)
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\json\__init__.py", line 234, in dumps
    return cls(
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\serializers\json.py", line 104, in default
    return super().default(o)
File "C:\Users\berna\AppData\Local\Programs\Python\Python38-32\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type User is not JSON serializable
HTTP GET /ajax/new_notification/ 500 [0.15, 127.0.0.1:64660]

引发此错误的代码在这里,我也是 django 的新手,所以也许解决方案很明显

def new_notification(request):
    user = request.user
    user.profile.notifications = user.profile.notifications + 1
    user.save()

    return JsonResponse(user, safe=False)

感谢您的帮助

标签: pythondjangoajaxdjango-views

解决方案


好吧,这个错误是不言自明的:

TypeError: Object of type User is not JSON serializable

不幸的是,请求对象中的用户(不一定是“用户”模型,如果我在这里错了,请纠正我)默认情况下不是 JSON 可序列化的。最简单的解决方案是仅映射必要的字段:

return JsonResponse({ "notifications": profile.notifications }, safe=True)

但这太天真了。相反,也许 django 序列化程序可以完成这项工作:

from django.core import serializers

def new_notification(request):
    user = request.user
    user.profile.notifications = user.profile.notifications + 1
    user.save()
    
    return JsonResponse(serializers.serialize('json', user), safe=False)

推荐阅读