Как разработать rest POST API в Django для вставки данных в две модели одновременно, когда вторая модель связана ForeignKey с первой моделью?

Модель пользователя

from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import UserManager, Permission, PermissionsMixin
from django.db import models

from django.utils import timezone
#from mptt.models import MPTTModel
from apps.base.models import DomainEntityIndexed
from apps.base.config import ROLE_CHOICES, ROLE_DICT, VEHICLE_CHOICES, VEHICLE_DICT, SIGNUP_CHOICES, SIGNUP_DICT

class User(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(unique=True)
    phone = models.CharField(max_length=16)
    address = models.CharField(max_length=200, null=True, blank=True)
    date_joined = models.DateTimeField(default=timezone.now)
    profile_photo = models.ImageField(upload_to=profileImage, null=True, blank=True)
    date_of_birth = models.DateTimeField(null=True, blank=True)
    role = models.PositiveSmallIntegerField(default=ROLE_DICT['Traveller'], choices=ROLE_CHOICES)
    
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)


    email_verified = models.BooleanField(default=False)
    email_bounced = models.BooleanField(default=False)
    phone_verified = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = SimpleUserManager()

Модель драйвера

class Driver(DomainEntityIndexed):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    nid = models.ImageField(upload_to=nidImage, null=True, blank=True)
    driving_license_number = models.CharField(max_length=50)
    driving_license = models.ImageField(upload_to=licenseImage)

Сериализатор

from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from .models import *
from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler

class UserSerializer(ModelSerializer):

    class Meta:
        model = User
        fields = ['id', 'first_name', 'last_name', 'email', 'password', 'phone', 
                  'profile_photo', 'address', 'date_of_birth']
        
        #fields = '__all__'
        extra_kwargs = {
            'password': {'write_only': True, 'required': False}
        }


    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 DriverSerializer(ModelSerializer):
 
   class Meta:
        model = Driver
        fields = '__all__'

api.py

from .serializers import UserSerializer, DriverSerializer, PasswordLoginSerializer
from .models import *
from .helpers import get_user_details, get_driver_details
from rest_framework.permissions import IsAuthenticated, IsAdminUser, AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView

    
class UserViewSet(APIView):
        permission_classes = (AllowAny,)
    
        def post(self, request, format=None):
            serializer = UserSerializer(data=request.data)
            if serializer.is_valid():
                user = serializer.create(serializer.validated_data)
                data = {
                    'user': get_user_details(user),
                }
                return Response(data, status=200)
            return Response({'detail': str(serializer.errors)}, status=400)

urls.py

url(r'^api/user-signup/$', api.UserViewSet.as_view(), name='user-signup'),
url(r'^api/driver-signup/$', api.create_driver, name='driver-signup'),

helper.py

def get_user_details(user):
    try:
            
        user_response = {
            'id': user.id,
            'first_name': user.first_name,
            'last_name': user.last_name,
            'phone': user.phone,
            'email': user.email,
            'address': user.address,
            'profile_photo': user.profile_photo.url,
            'date_joined': user.date_joined,
            'date_of_birth': user.date_of_birth
        }
        return user_response
    except Exception as e:
        return {}


    def get_driver_details(users):
        try:
            driver_response = {
                'id': users.id,
                'user': get_user_details(users.user),
                'nid': users.nid,
                'rider_noc': users.rider_noc,
                'driving_license_number': users.driving_license_number,
                'driving_license': users.driving_license.url,
                'vehicle_type': users.vehicle_type,
                'vehicle_model': users.vehicle_model,
                'registration_no': users.registration_no
            }
            return driver_response
        except Exception as e:
            return {}

Конечная точка /api/user-signup/ работает нормально. Я не уверен, как обрабатывать часть водителя. если роль 'user', то данные будут вставлены в модель user, если роль 'driver', то данные пользователя будут в модели user, а данные водителя - в модели driver.

Выше приведено то, что я сделал на данный момент. Не могли бы вы помочь завершить это? Спасибо.

Вернуться на верх