You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

额外优化建议

  1. 简化重复用户检查逻辑:
    模型中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验证错误,包含对应提示信息。

  2. 修复自定义User模型的密码字段:
    继承AbstractBaseUser时,父类已经内置了密码相关的字段和安全处理逻辑,无需自己定义password = models.TextField(blank=False),这个定义会覆盖父类逻辑,可能导致密码处理异常,直接删除该字段即可。

内容的提问来源于stack exchange,提问作者U. Watt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:57:17