Django注册接口返回User对象报JSON序列化错误的解决办法
Django注册返回用户对象时JSON序列化错误解决方法
我正在尝试为用户创建注册方法,使用自定义User模型、序列化器和视图,但返回创建后的用户对象时抛出错误:Object of type User is not JSON serializable。以下是我的代码:
User模型
class User(AbstractBaseUser): name = models.CharField(max_length=128, blank=False) created_at = models.DateTimeField(auto_now_add=True) is_admin = models.BooleanField(blank=True,default=False, verbose_name="Is admin") designation = models.CharField(max_length=90, blank=True) email = models.EmailField(max_length=160, blank=False, unique=True) password = models.TextField(blank=False) USERNAME_FIELD = "email" def __str__(self): return self.name + " " + self.email
User序列化器
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ["id", "name", "designation", "is_admin", "email", "password"] extra_kwargs = { 'password': {'write_only': True} } # 创建用户时对密码加盐哈希 def create(self, validated_data): user = User.objects.create( name=validated_data.get('name'), email=validated_data.get('email'), password=make_password(password=validated_data.get('password'), salt=get_random_string(length=32)) ) return user
视图代码
class AuthViewset(viewsets.ViewSet): def signUp(self, request, **kwargs): serializer = UserSerializer(data=request.data) serializer.is_valid(raise_exception=True) is_new = True user = User.objects.filter(email=request.data['email']).first() if user is not None: # 用户已存在 is_new = False else: # 创建用户 user = serializer.create(serializer.validated_data) if is_new: return Response({ "user": user, "message": "Created new user" }, status=status.HTTP_201_CREATED) else: return Response({ "message": "User already exists" }, status=status.HTTP_409_CONFLICT)
错误原因
Django的Response无法直接将ORM模型实例序列化为JSON格式,你直接返回user这个模型对象,系统不知道如何将其转换为JSON可识别的数据结构。
解决方法
不要直接返回模型对象,而是用序列化器将实例转换为JSON兼容的字典:
修改视图中创建用户后的返回逻辑:
if is_new: # 用序列化器处理用户实例 serialized_user = UserSerializer(user) return Response({ "user": serialized_user.data, "message": "Created new user" }, status=status.HTTP_201_CREATED)
额外优化建议
简化重复用户检查逻辑:
模型中email字段设置了unique=True,serializer.is_valid()会自动验证邮箱唯一性,无需手动查询数据库。简化后的视图代码:class AuthViewset(viewsets.ViewSet): def signUp(self, request, **kwargs): serializer = UserSerializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.save() serialized_user = UserSerializer(user) return Response({ "user": serialized_user.data, "message": "Created new user" }, status=status.HTTP_201_CREATED)当邮箱已存在时,
is_valid()会自动抛出400验证错误,包含对应提示信息。修复自定义User模型的密码字段:
继承AbstractBaseUser时,父类已经内置了密码相关的字段和安全处理逻辑,无需自己定义password = models.TextField(blank=False),这个定义会覆盖父类逻辑,可能导致密码处理异常,直接删除该字段即可。
内容的提问来源于stack exchange,提问作者U. Watt
相关产品推荐
相关产品推荐

