Django - Как создать несколько экземпляров модели одновременно, поскольку они связаны между собой
Я хочу создать профиль пользователя, а у профиля пользователя есть местоположение (адрес). Мне нужно сначала создать профиль, затем местоположение, а затем сопоставить профиль и местоположение с помощью третьей модели ProfileLocation. Я хочу сделать это с помощью одного вызова api, потому что все данные поступают из одной формы, а местоположение зависит от профиля.
Имеется модель местоположения, которая имеет поля OneToOne для страны, штата и города. Для стран, штатов и городов таблицы базы данных будут заполнены раньше времени. Есть дополнительная модель ProfileLocation, которая связывает профиль с местоположением. Поэтому я должен создать их все сразу и пытаюсь понять, как лучше это сделать. Также какой тип представления DRF я должен использовать для конечной точки? Мне нужно понять логику, пожалуйста, и я не могу найти пример в сети.
Нужно ли мне создать представление на основе пользовательской функции и прогнать данные через существующие сериализаторы? В таком случае как я могу связать входящие данные для каждого конкретного сериализатора?
Все это очень ново для меня
Locations model.py:
Это мой Location models.py:
Вот сериализаторы Location, которые являются обычными модельными сериализаторами:
from rest_framework import serializers
from .models import *
from profiles.models import ProfileLocation
class CountrySerializer(serializers.ModelSerializer):
class Meta:
model = Country
fields = [
"id",
"name",
"country_code",
"dial_code",
"created_at",
"updated_at",
]
class StateSerializer(serializers.ModelSerializer):
class Meta:
model = State
fields = [
"id",
"name",
"country",
"created_at",
"updated_at",
]
class CitySerializer(serializers.ModelSerializer):
class Meta:
model = City
fields = [
"id",
"name",
"country",
"state",
"created_at",
"updated_at",
]
class LocationSerializer(serializers.ModelSerializer):
class Meta:
model = Location
fields = [
"name",
"street",
"additional",
"zip",
"city",
"phone",
"created_at",
"updated_at",
]
class ProfileLocationSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = ProfileLocation
fields =[
"location"
"profile"
]
и сериализатор профиля:
from rest_framework import serializers
from .models import *
from locations.serializers import ProfileLocationSerializer
class ProfileSerializer(serializers.ModelSerializer):
location = ProfileLocationSerializer()
class Meta:
model = Profile
fields = [
"background",
"photo",
"first_name",
"middle_name",
"last_name",
"birthdate",
"gender",
"bio",
"languages",
"is_verified",
"verification",
"location",
"website",
"user",
"created_at",
"updated_at",
]
def create(self, validated_data):
new_profile = Profile.objects.create(**validated_data)
return new_profile
Этот вид создает профиль без проблем, но исключает местоположение, очевидно.
class ProfileViewSet(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticated]
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
Заранее благодарю
ваша процедура идеальна, просто нужно переопределить метод create сериализатора
def create(self, validated_data):
# for better understand print or log the validated_data
location_data = validated_data.pop('location') # all location data will be poped from the validated data as a dict
# create a location object
location_obj = Location.objects.create(**location_data)
location_obj.save()
# then add the location object in profile obj
new_profile = Profile.objects.create(**validated_data, location=location_ojb)
new_profile.save()
return new_profile
пожалуйста, ознакомьтесь с официальным документом