OPT удалить после проверки в базе данных

Я работаю с Django и верифицировал пользователя с помощью OTP по электронной почте, а OTP сохранил в базе данных. После верификации я хочу удалить OTP из базы данных. В противном случае пользователь не верифицирует аккаунт в течение двух минут, поэтому я хочу удалить OTP из базы данных

views.py

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
    data = super().validate(attrs)
    serializer = UserSerializer(self.user).data
    for k, v in serializer.items():
        data[k] = v
    return data
class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer
class RegisterView(APIView):
permission_classes = [AllowAny]

def post(self, request):
    try:
        data = request.data
        serializer = UserSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            send_otp_via_email(serializer.data['email'])
            return Response({
                'status': '200',
                'message': 'User registered successfully Please Check your email for verification',
                'data': serializer.data
            })
        return Response({
            'status': '400',
            'message': 'User registration failed',
            'data': serializer.errors
        })
    except Exception as e:
        return Response({
            'status': '400',
            'message': 'User registration failed',
            'data': str(e)
        })


class VerifyOTP(APIView):
permission_classes = [AllowAny]

def post(self, request):
    try:
        data = request.data
        serializer = VerifyAccountSerializer(data=data)
        if serializer.is_valid():
            email = serializer.data['email']
            otp = serializer.data['otp']

            user = User.objects.filter(email=email)
            if not user.exists():
                return Response({
                    'status': '400',
                    'message': 'email, user not exists',
                    'data': 'invalid email'
                })
            if user[0].otp != otp:
                return Response({
                    'status': '400',
                    'message': 'something went wrong',
                    'data': 'invalid OTP'
                })
            user = user.first()
            user.is_valid = True
            user.save()

            return Response({
                'status': '200',
                'message': 'Account verified',
                'email': serializer.data['email'],
            })
        return Response({
            'status': '400',
            'message': 'User registration failed',
            'data': serializer.errors
        })



    except Exception as e:
        return Response({
            'status': '400',
            'message': 'User registration failed',
            'data': str(e)
        })

serializer.py

class UserSerializer(serializers.ModelSerializer):
class Meta:
    model = User
    fields = [
        'id',
        'name',
        'email',
        'phone',
        'password',
        'address',
        'is_valid',

    ]
    extra_kwargs = {
        'password': {'write_only': True}
    }

def create(self, validated_data):
    password = validated_data.pop('password', None)
    instance = self.Meta.model(**validated_data)
    if password is not None:
        instance.set_password(password)
    instance.save()
    return instance


class VerifyAccountSerializer(serializers.Serializer):
email = serializers.EmailField()
otp = serializers.CharField()

models.py

class User(AbstractUser):
username = models.CharField(max_length=255, null=True, blank=True)
name = models.CharField(max_length=255)
email = models.CharField(max_length=255, unique=True)
phone = models.CharField(max_length=255)
password = models.CharField(max_length=255)
address = models.CharField(max_length=500, null=True, blank=True)
is_valid = models.BooleanField(default=False)
otp = models.CharField(max_length=6, null=True, blank=True)


USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']

emails.py

def send_otp_via_email(email):
subject = 'Your account verification code'
otp = random.randint(100000, 999999)
message = 'Your verification code is {}'.format(otp)
email_from = settings.EMAIL_HOST_USER
send_mail(subject, message, email_from, [email])
user_obj = User.objects.get(email=email)
user_obj.otp = otp
user_obj.save()
Вернуться на верх