Django DRF注册序列化器校验邮箱时报User matching query does not exist错误
Django REST Framework注册序列化器
User matching query does not exist错误解决方案 错误触发核心原因
错误由邮箱查重逻辑的错误写法直接触发:
Model.objects.get()方法在查询不到匹配记录时,会直接抛出DoesNotExist异常,而非返回空值。当你用未注册过的邮箱提交注册请求时,User.objects.get(email=self.validated_data['email'])会直接抛出你遇到的这个错误,后续的存在性判断逻辑完全不会执行。- 存在性判断的API用法错误:
exists()是Django QuerySet的方法,get()返回的是单个模型实例,没有exist()(你还拼写漏了末尾的s)方法,就算邮箱已存在,执行到这行也会抛出属性错误。
其他隐含代码问题
- 导包错误:
from rest_framework import serializer应为复数形式serializers password2字段的style参数语法错误,缺少value值,正确写法为style={'input_type': 'password'}
修复后完整代码
from rest_framework import serializers from django.contrib.auth.models import User class RegistrationSerializer(serializers.ModelSerializer): password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True) class Meta: model = User fields = ['email', 'username', 'password', 'password2'] extra_kwargs = {'password': {'write_only': True}} def save(self): password = self.validated_data['password'] password2 = self.validated_data['password2'] if password != password2: raise serializers.ValidationError({'error': 'password and password2 do not match'}) # 修复邮箱查重逻辑:改用filter生成QuerySet后调用exists方法 if User.objects.filter(email=self.validated_data['email']).exists(): raise serializers.ValidationError({'error':'email already exists'}) account = User(email=self.validated_data['email'], username=self.validated_data['username']) account.set_password(password) account.save() return account
更符合DRF规范的写法是将用户创建逻辑放到序列化器的create方法中,而非重写save方法,避免破坏原有的序列化器保存逻辑。
内容的提问来源于stack exchange,提问作者romina
相关产品推荐
相关产品推荐

