python-3.x - drf CustomUser 匹配查询不存在
问题描述
我正在使用 customuser 开发移动应用程序。我正在尝试在创建用户时通过邮件发送 otp 并将 is_verify 设置为 false 并且在用户使用 otp 验证之后 is_verify 将设置为 true 但如果用户不验证 otp 添加关闭应用程序然后在注册时再次添加检查如果用户存在并且 is_verified 为 true,则返回已经存在,否则创建用户并再次发送 otp。因此,如果用户不存在,则出现错误,然后显示此错误:
users.models.CustomUser.DoesNotExist: CustomUser matching query does not exist.
并且它从除了 customuser.doesnotexist 块中得到这个错误
模型.py:
class CustomUser(AbstractBaseUser, PermissionsMixin):
first_name = models.CharField(_('first name'), max_length=50)
last_name = models.CharField(_("last name"), max_length=50)
email = models.EmailField(_('email address'), unique=True)
mobile_number = models.CharField(
_('mobile number'), max_length=12, unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
user_type = models.IntegerField(_("user_type"))
otp = models.CharField(_("otp"), max_length=10, default="0")
is_verified = models.BooleanField(default=False)
USER_TYPE_CHOICES = (
(1, 'users'),
(2, 'courier'),
(3, 'admin'),
)
user_type = models.PositiveSmallIntegerField(
choices=USER_TYPE_CHOICES, null=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserMananager()
def __str__(self):
return self.email
序列化程序.py:
class CustomUserSerializer(serializers.ModelSerializer):
profile = UserProfileSerializer(required=False)
password = serializers.CharField(write_only=True, required=False)
class Meta:
model = CustomUser
fields = ('id', 'first_name', 'last_name', 'email',
'mobile_number', 'password', 'is_active', 'user_type', 'otp', 'profile')
def create(self, validated_data):
profile_data = validated_data.pop('profile', None)
user = CustomUser(
email=validated_data['email'],
mobile_number=validated_data['mobile_number'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
user_type=validated_data['user_type'],
)
user.set_password(validated_data['password'])
def random_with_N_digits(n):
range_start = 10**(n-1)
range_end = (10**n)-1
return randint(range_start, range_end)
otp = random_with_N_digits(5)
user.otp = otp
user.is_active = False
user.save()
subject = 'Please Confirm Your Account'
message = 'Your 5 Digit Verification Pin: {}'.format(otp)
email_from = '*****'
recipient_list = [str(user.email), ]
send_mail(subject, message, email_from, recipient_list)
#user = CustomUser.objects.create(**validated_data)
# if profile_data:
UserProfile.objects.create(
user=user, age=None, gender=None)
return user
def update(self, instance, validated_data):
profile_data = validated_data.pop('profile', None)
# update user data
instance.first_name = validated_data.get(
'first_name', instance.first_name)
instance.last_name = validated_data.get(
'last_name', instance.last_name)
instance.email = validated_data.get('email', instance.email)
instance.save()
password = validated_data.get('password', None)
if password:
instance.set_password(password)
instance.save()
return instance
视图.py:
@api_view(["POST"])
@permission_classes((AllowAny,))
def register(request):
try:
user = CustomUser.objects.get(
email=request.data.get('email'), is_verified=True)
if user:
return Response({'message': 'Customer with this mail already exists', 'status': 'false', 'status_code': status.HTTP_401_UNAUTHORIZED, 'currentTimeStamp': datetime.datetime.now()}, status=status.HTTP_400_BAD_REQUEST)
except CustomUser.DoesNotExist:
serializer = CustomUserSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
token, created = Token.objects.get_or_create(user=user)
current_time = datetime.datetime.now()
return Response({'status_code': status.HTTP_200_OK, 'status': 'true', 'currentTimeStamp': current_time, 'message': 'User registered successfully, OTP sent to your Mail', 'data': {'id': user.id, 'token': token.key, 'user_type': user.user_type}}, status=status.HTTP_200_OK)
return Response({'message': serializer.errors, 'status': 'false', 'status_code': status.HTTP_401_UNAUTHORIZED, 'currentTimeStamp': datetime.datetime.now()}, status=status.HTTP_400_BAD_REQUEST)
检查后似乎显示错误:
user = CustomUser.objects.get(email=email)
但是因为我已经使用 serializer.save 创建了用户,所以它应该获取当前用户
编辑:
我通过将 serailizer.save 对象保存给用户解决了这个问题,但我仍然陷入这种情况,因为我想每次都发送邮件,直到用户 is_verified 为真,但在首次注册后,它显示的 customuser 已经存在。它唯一的检查电子邮件字段,因为它带有 Django
解决方案
推荐阅读
- laravel - 手机设备无法访问前端应用程序背后的 API
- r - 寓言功能 - 理论问题
- c# - 如何添加键而不是值以稍后在开关中添加值
- r - 如何根据列表在 R 中制作幻灯片?
- c# - 从外部调用泛型类函数
- filter - FFmpeg 连接过滤器
- azure-active-directory - 图形 API:架构扩展日期过滤器不起作用
- elasticsearch - 如何在 Elasticsearch 的无痛脚本中使用 Java 的 ArrayList 类?
- python - 如何使用 python 在 SQL nvarchar 列中插入 NULL 值
- android - gstreamer 将 rtpsession 连接到 multiudpsink