Как реализовать логику регистрации и входа как API, используя ViewSet вместо общих представлений в Django Rest Framework

Я новичок в viewset при использовании Django Rest Framework для создания registration и login логики в качестве API с использованием ViewSet вместо общих представлений, и передавая ресурсы автономному фронтенд-приложению React на другом порту. В предыдущем проекте, где у меня была возможность использовать django template как frontend внутри проекта django, я просто использовал django Views для реализации логики регистрации и входа и шаблона, сделав следующее:

// MyOldMethod.py

@login_required
def index(request):
    return render(request,'customers/index.html')
def signup(request):
    context = {}
    form = UserCreationForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            user = form.save()
            login(request,user)
            return render(request,'customers/index.html')
    context['form']=form
    return render(request,'registration/signup.html',context)

Таким образом, базовая аутентификация входа была установлена. Теперь для этого случая мне нужно использовать viewset и serializer, а в конце подключить фронтенд-приложение React к API django с помощью axios. На данный момент я реализовал models.py, serializer.py и api.py, а также urls.py следующим образом в приложении customers.

// models.py внутри customers App

from django.db import models
from django.core.validators import RegexValidator

class Customer(models.Model):
    name = models.CharField(max_length=100)
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
    phone = models.CharField(validators=[phone_regex], max_length=17, blank=True) # validators should be a list
    email = models.EmailField()
    activated = models.BooleanField(default=False)
    message = models.CharField(max_length=300)
    created_at = models.DateTimeField(auto_now_add=True)
    def _str_(self):
        return self.name

// serializers.py внутри клиентов App

from rest_framework import serializers
from .models import Customer

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

// serializers.py внутри клиентов App

from rest_framework.decorators import permission_classes
from Customer.models import Customer
from rest_framework import viewsets, permissions
from .serializers import CustomerSerializer

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    permission_classes = [
        permissions.AllowAny
    ]
    serializer_class = CustomerSerializer

// urls.py внутри customers App

from rest_framework import routers, urlpatterns
from .api import CustomerViewSet

router = routers.DefaultRouter()
router.register('api/customer', CustomerViewSet, 'customer')

urlpatterns = router.urls

Проблема с этой реализацией, основанной на моем ограниченном понимании viewset, заключается в том, что я не знаю, как написать логику регистрации и входа в систему с помощью viewset, как я это сделал в MyOldMethod.py. Я буду очень признателен за любую помощь в достижении этой цели и более близкое знакомство с арканой viewset, потому что среди предопределенных действий (list, create, retreive, update, partial_update, destroy) я не увидел ни одного, которое помогло бы реализовать аутентификацию и логику регистрации и входа, как я делал раньше с помощью общих представлений. Заранее спасибо.

Вы можете получить много информации о ModelViewSet здесь.
Если говорить о вашем вопросе, то его можно решить разными способами. Вы можете переопределить create() в CustomerSerializer:

class Customererializer(serializers.ModelSerializer):
    # ....

    def create(self, validated_data):
        customer = Customer.objects.create(**validated_data)
        return customer

Другим решением является написание собственного метода create в классе viewset:

class CustomerViewSet(viewsets.ModelViewSet): 
    def create(self, request, format=None):
        # create user here
Вернуться на верх