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成为注册的必填项,只需修改序列化器,显式将其标记为必填,有两种方式:
- 显式声明
email字段并设置required=True:
class UserRegistrationSerializer(serializers.ModelSerializer): email = serializers.EmailField(required=True) # 强制必填 class Meta: model = User fields = ('username', 'email', 'password') # 其余create、validate方法保持不变
- 使用
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
相关产品推荐
相关产品推荐

