Проблема с отправкой 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:
Когда я передаю его с необработанным 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.
Если у кого-нибудь есть идеи, это очень помогло бы!