Проблема с отправкой JSON-массива в multipart/form-data из POSTMAN

Я борюсь с записываемыми сериализаторами в DRF и постоянно сталкиваюсь с такой проблемой:

"music_preferences": [ "Неверный тип. Ожидалось значение pk, получен список." ], "artists": [ "Неверный тип. Ожидаемое значение pk, получен список." ]

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

class EventCreateSerializer(serializers.ModelSerializer):
    music_preferences = serializers.PrimaryKeyRelatedField(queryset=Music.objects.all(), many=True, write_only=True)
    artists = serializers.PrimaryKeyRelatedField(queryset=Artist.objects.all(), many=True, write_only=True)
    event_picture = serializers.ImageField(required=False)  
# Made optional

    class Meta:
        model = Event
        fields = (
            'name',
            'start_date',
            'end_date',
            'venue',
            'minimum_age',
            'vibe',
            'public_type',
            'dresscode',
            'music_preferences',
            'event_picture',
            'artists',
        )

    def create(self, validated_data):
        music_preferences_data = validated_data.pop('music_preferences')
        artists = validated_data.pop('artists')

        
# Check if event_picture is provided, else use the venue's image
        if 'event_picture' not in validated_data or not validated_data['event_picture']:
            venue = validated_data['venue']
            validated_data['event_picture'] = venue.venue_picture  
# Use venue_picture from the venue

        event = Event.objects.create(**validated_data)

        
# Set music preferences
        event.music_preferences.set(music_preferences_data)
        event.artists.set(artists)
        
        return event

Вот вид, в котором он вызывается:

def post(self, request, venue_id):
        data = request.data.copy()

        
# Add files to the data dictionary
        if 'event_picture' in request.FILES:
            data["event_picture"] = request.FILES["event_picture"]

        
        data['music_preferences'] = json.loads(data['music_preferences'])
        data['artists'] = json.loads(data['artists'])
        
        serializer = EventCreateSerializer(data=data)
        
        if serializer.is_valid():
            event = serializer.save()
            event_data = EventCreateSerializer(event).data
            event_data['id'] = 
            return Response({
                'data': event_data
            }, status=status.HTTP_201_CREATED)
        
        
# Log serializer errors
        print("Serializer Errors:", serializer.errors, serializer.error_messages)
        
        return Response({
            'error': serializer.errors
        }, status=status.HTTP_400_BAD_REQUEST)event.id

А вот что я отправляю через POSTMAN:

Моя форма-данные POSTMAN

Когда я передаю его с необработанным json, он работает, т.е.:

{
    "name": "EXAMPLE",
    "start_date": "2024-09-01T23:59:00Z",
    "end_date": "2024-09-02T05:00:00Z",
    "venue": 1,
    "minimum_age": 18,
    "dresscode": "Casual",
    "music_preferences": "[1, 2]",
    "artists": "[2]",
    "public_type": "Anyone",
    "vibe": "Fun"
}

Я пробовал форматировать массивы ПКС разными способами (["1", "2"], "[1,2]" и т.д.) в форме-данных, и мне нужно отправить этот запрос через многочастную форму, потому что мне нужно разрешить загрузку фотографий.

Я также добавил несколько отпечатков для отладки, и все, кажется, работает. После получения массивов json я использую json.loads для преобразования их в массивы python, и это действительно работает...

НЕОБРАБОТАННЫЕ ДАННЫЕ:

------

<QueryDict: {'name': ['Example'],'start_date': ['2024-09-01T23:59:00Z'],'end_date': ['2024-09-02T05:00:00Z'],'venue': ['1'], 'minimum_age': ['18'], 'dresscode': ['Casual'], 'music_preferences': [[1, 2]], 'артисты': [[2]], 'public_type': ['Anyone'], 'vibe': ['Fun']}>

------

ДАННЫЕ МУЗЫКАЛЬНЫХ_ПРЕДПОЧТЕНИЙ ПОСЛЕ ЗАГРУЗКИ

------

[1, 2]

------

ДАННЫЕ О ХУДОЖНИКАХ ПОСЛЕ ЗАГРУЗКИ

------

[2]

------

Я много искал и не нашел много информации по этому вопросу - записываемые "вложенные" сериализаторы кажутся довольно сложными в Django.

Если у кого-нибудь есть идеи, это очень помогло бы!

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