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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:57:02