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