Django中User对象无法JSON序列化问题求解
解决Django中User对象无法JSON序列化的问题
出现Object of type User is not JSON serializable错误的原因很直接:Django的User是模型实例,不属于Python原生的可JSON序列化类型(比如字典、列表),JsonResponse默认只能处理原生类型,所以得把User对象转成可序列化的格式,下面是几种实用的解决方法:
方法一:手动构造需要的字段字典
只提取前端需要的字段,避免返回敏感或无用数据,灵活性最高:
def edituser(request, id): member = User.objects.get(id=id) # 按需构造字典,只保留前端需要的字段 user_info = { 'id': member.id, 'username': member.username, 'email': member.email, 'first_name': member.first_name, 'last_name': member.last_name } return JsonResponse(user_info)
方法二:使用model_to_dict工具函数
Django提供了model_to_dict可以快速把模型转成字典,记得排除敏感字段(比如密码哈希):
from django.forms.models import model_to_dict def edituser(request, id): member = User.objects.get(id=id) # 排除不需要返回的敏感/冗余字段 user_info = model_to_dict(member, exclude=['password', 'last_login', 'is_superuser']) return JsonResponse(user_info)
方法三:自定义JSON编码器(适合频繁序列化模型的场景)
如果项目经常需要把模型转成JSON,可以自定义编码器类,复用性更强:
from django.core.serializers.json import DjangoJSONEncoder from django.contrib.auth.models import User class UserJSONEncoder(DjangoJSONEncoder): def default(self, obj): if isinstance(obj, User): return { 'id': obj.id, 'username': obj.username, 'email': obj.email, 'first_name': obj.first_name, 'last_name': obj.last_name } # 其他类型交给父类处理 return super().default(obj) def edituser(request, id): member = User.objects.get(id=id) return JsonResponse(member, encoder=UserJSONEncoder, safe=False)
内容的提问来源于stack exchange,提问作者Amedeo De Longis
相关产品推荐
相关产品推荐

