Django TypeError:用户类型的对象不是 JSON 可序列化的

Posted

技术标签:

【中文标题】Django TypeError:用户类型的对象不是 JSON 可序列化的【英文标题】:Django TypeError: Object of type User is not JSON serializable 【发布时间】:2020-12-02 14:21:46 【问题描述】:

所以我试图在 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)

感谢您的帮助

【问题讨论】:

【参考方案1】:

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

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)

【讨论】:

嗨,抱歉耽搁了,所以我尝试了第一个,它消除了错误,但它没有给通知模型+1。然后我尝试第二个,它给了我这个错误(TypeError:'User' object is not iterable) 没错,serialize 需要一个集合(在大多数示例中为 QuerySet) - 因此,从技术上讲,您可以将它包装到一个列表中 return JsonResponse(serializers.serialize('json', [user]),安全=假)。但是在返回语句之前应用的副作用(增量)应该与格式化响应无关。您确定 DB 中的值正在增加(例如,您可以打印它吗?) 是的,它不会增加价值,我确信(我可以在我的管理页面中看到打印的价值) 我也尝试 return JsonResponse(serializers.serialize('json', [user]), safe=False) 但它不会增加价值

以上是关于Django TypeError:用户类型的对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“TopicSerializer”类型的对象不是 JSON 可序列化的 Django

django:TypeError:'tuple'对象不可调用

Django - TypeError - NoneType' 对象不可迭代 - 不明白为啥 Object 被识别为 None

TypeError:不支持的操作数类型/:'str'和'str'django setting.py

Django Rest Framework TypeError需要一个类似字节的对象,而不是'str'

Django 预览,TypeError:'str' 对象不可调用