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

Django REST API中Email未在JSON响应中显示的问题排查

Django REST Framework用户注册:email字段未出现在校验错误响应中的问题

我在Django REST Framework中开发用户注册功能,相关代码如下:

View代码

class UserRegistrationView(APIView):
    def post(self, request):
        serializer = UserRegistrationSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            token = Token.objects.create(user=user)
            response_data = {
                'token': token.key,
                'message': 'User registration successful.'
            }
            return Response(response_data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Serializer代码

class UserRegistrationSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = User
        fields = ('username', 'email', 'password')
    
    def create(self, validated_data):
        user = User.objects.create(
            username=validated_data['username'],
            email=validated_data['email']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

    def validate_username(self, data):
        if User.objects.filter(username=data).exists():
            raise serializers.ValidationError("Username already exists.")
        return data
    
    def validate_email(self, data):
        if User.objects.filter(email=data).exists():
            raise serializers.ValidationError("Email already exists.")
        return data

URL配置

path('reg/', UserRegistrationView.as_view(), name='userreg')

发送POST请求后,得到如下JSON响应:

{ "username": [ "This field is required." ], "password": [ "This field is required." ] }

明明Serializer中已声明包含email字段,为何email未出现在响应中?


问题原因

Django默认的User模型中,email字段的默认属性是blank=True(允许表单提交为空),你的UserRegistrationSerializer继承自ModelSerializer时,会自动继承模型字段的这一属性——即email字段被标记为非必填项。当请求中没有传入email参数时,序列化器不会将其判定为必填错误,因此不会在错误响应中返回该字段的提示。

而username和password是Django默认User模型的强制必填字段,请求中缺少它们时会直接触发必填校验错误,所以会出现在响应里。

解决方案

要让email成为注册的必填项,只需修改序列化器,显式将其标记为必填,有两种方式:

  1. 显式声明email字段并设置required=True:
class UserRegistrationSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(required=True)  # 强制必填

    class Meta:
        model = User
        fields = ('username', 'email', 'password')
    
    # 其余create、validate方法保持不变
  1. 使用extra_kwargs配置字段属性:
class UserRegistrationSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email', 'password')
        extra_kwargs = {
            'email': {'required': True}  # 配置email为必填
        }
    
    # 其余create、validate方法保持不变

修改完成后,当请求中缺少email字段时,错误响应就会包含email的必填提示。


内容的提问来源于stack exchange,提问作者user21944756

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:36