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

пожалуйста, ознакомьтесь с официальным документом

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