Как разработать 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.
Выше приведено то, что я сделал на данный момент. Не могли бы вы помочь завершить это? Спасибо.