Как реализовать в DRF реферальную подписку

Есть задача реализовать реферальную систему на DRF: отправляется на адрес opt/ POST запрос с номером телефона, возвращается OPT код(имитация) Далее получение токена на адрес token/ отправляется POST запрос с номером телефона и полученный opt-код, в ответ возвращается токен. Далее при создании пользователя (это происходит когда выполняется первый POST запрос с номером телефона) у него есть реферальный код, по которому другой пользователь может подписаться на него. Вот тут и есть сам вопрос, как ее реализовать? На текущий момент реализована модель юзера models.py:

from django.contrib.auth.models import AbstractUser
from django.db import models


class User(AbstractUser):
    phone_number = models.IntegerField(
        verbose_name="Номер телефона",
        blank=False,
        unique=True,
        null=True,
    )
    refer_number = models.CharField(
        unique=True,
        max_length=6
    )
    otp = models.IntegerField(
        default=None,
        blank=False,
        null=True
    )

views.py

import time
import string
import random
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
from rest_framework.permissions import IsAuthenticated
from .serializers import *


def random_number(size=6, chars=string.ascii_uppercase + string.digits):
    """Generation referal code"""
    return ''.join(random.choice(chars) for _ in range(size))


@api_view(['POST'])
def generate_otp(request):
    """Generation sms-code"""
    phone_number = request.data.get('phone_number', None)
    refer_number = random_number()
    if phone_number:
        if User.objects.filter(phone_number=phone_number).exists():
            otp = 5555  # here there should be a random generation of the sms code and sending it
            User.objects.filter(phone_number=phone_number, otp=otp)
            time.sleep(2)
            return Response({'success': True})
        else:
            otp = 5555  # here there should be a random generation of the sms code and sending it
            User.objects.get_or_create(phone_number=phone_number, otp=otp, refer_number=refer_number,
                                       username=phone_number)
            time.sleep(2)
        return Response({'success': True})
    return Response({"trouble": 'ошибка'})


@api_view(['POST'])
def verify_otp(request):
    """SMS confirmation and token receipt"""
    otp = request.data.get('otp', None)
    phone_number = request.data.get('phone_number', None)
    user = User.objects.get(phone_number=phone_number, otp=otp)
    if otp and phone_number:
        try:
            user
        except User.DoesNotExist:
            return Response({'message': 'Invalid OTP'})

    token = Token.objects.create(user=user)
    return Response({'token': token.key})


@api_view(['GET', 'POST'])
@permission_classes([IsAuthenticated])
def profile(request):
    if request.method == 'GET':
        phone_number = request.data.get('phone_number', None)
        user = User.objects.filter(phone_number=phone_number)
        serializer = UserSerializer(user, many=True)
        return Response(serializer.data)

serializers.py

from rest_framework import serializers
from .models import User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('phone_number', 'refer_number')
        model = User
        read_only = True

urls.py

from django.urls import path
from .views import *

urlpatterns = [
    path('otp/', generate_otp),
    path('token/', verify_otp),
    path('profile/', profile)

Только начинаю в программировании на Python, заранее благодарю за все ответы)


Ответы (0 шт):