POST от одной ко многим моделям с помощью API View

У меня есть эта модель

One to many model

Я хочу отправить это в конечную точку местоположения

{
"location": {
    "latitude": "1.23456789",
    "longitude": "1.23456789",
    "resources": [
        {
            "url": "s3/locations/1/es.mp4",
            "name": "lorem_1"
        },
        {
            "url": "s3/locations/1/en.mp4",
            "name": "lorem2"
        }
    ]
}

Моя цель - добавить местоположение с многими ресурсами и сделать это через одну конечную точку местоположения с помощью API Views

Вот мое мнение:

class LocationView(APIView, api_settings.DEFAULT_PAGINATION_CLASS):
    queryset = Location.objects.all()
    permission_classes = (permissions.AllowAny, )
    serializer_class = LocationSerializer

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return response.Response(request.data)

А это мой сериализатор:

class LocationSerializer(serializers.ModelSerializer):
resources = ResourceSerializer(source='resource_set', many=True, read_only=True)

class Meta:
    model = Location
    fields = ('id', 'latitude', 'longitude', 'resources')

Вложенные сериализаторы доступны только для чтения, вам необходимо переопределить метод create.

# serializers.py

class LocationSerializer(serializers.ModelSerializer):
    resources = ResourceSerializer(source='resource_set', many=True, read_only=True)

    def create(self, validated_data):
        resources_data = validated_data.pop('resources')
        location = Location.objects.create(**validated_data)
        for resource in resources_data:
            Resource.objects.create(location=location, **resource)
        return location

    class Meta:
        model = Location
        fields = ('id', 'latitude', 'longitude', 'resources')

То же самое относится к методу update.
Более подробно в официальной документации.

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