Django REST - Неверные данные. Ожидали словарь, а получили {datatype}
Используя DRF, я пытаюсь выполнить запрос PUT для обновления файла в моей базе данных.
Я получаю ошибку, указанную в заголовке, именно Invalid data. Expected a dictionary, but got {datatype}.
.
В полном тексте говорится следующее (serializer.error_messages
):
{
"required": "This field is required.",
"null": "This field may not be null.",
"invalid": "Invalid data. Expected a dictionary, but got {datatype}."
}
Я не вижу никакой дополнительной полезной информации в терминале, только это.
Моя модель такова:
from django.db import models
class File(models.Model):
name = models.CharField(max_length=1024)
upload_timestamp_date = models.DateField(auto_now_add=True)
upload_timestamp_time = models.TimeField(auto_now_add=True)
file = models.FileField()
def __str__(self):
return self.name
Мой сериализатор выглядит так:
from rest_framework import serializers
from .models import File
class FileSerializer(serializers.ModelSerializer):
class Meta:
model = File
fields = '__all__'
Мое мнение на данный момент таково:
@api_view(['GET', 'PUT', 'DELETE'])
@csrf_exempt
def file(request, file_id, format=None):
try:
data = File.objects.get(pk=file_id)
except File.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = FileSerializer(data)
return Response({'file': serializer.data}, status=status.HTTP_200_OK)
elif request.method == 'PUT':
serializer = FileSerializer(data, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.error_messages, status=status.HTTP_400_BAD_REQUEST)
Все сводится к тому, что вызов is_valid()
является ложным, с этими сообщениями об ошибках.
Я знаю, что запрос GET возвращает такие данные:
{
"file": {
"id": 1,
"name": "test",
"upload_timestamp_date": "2022-04-16",
"upload_timestamp_time": "17:02:56.790144",
"file": "https://files-learning.s3.amazonaws.com/akash_nemw.jpg"
}
}
Я представлял эти данные в теле (только изменяя name
):
{
"id": 1,
"name": "testing change",
"upload_timestamp_date": "2022-04-16",
"upload_timestamp_time": "17:02:56.790144",
"file": "https://files-learning.s3.amazonaws.com/akash_nemw.jpg"
}
Пожалуйста, любая помощь будет очень признательна, я потратил день, пытаясь понять, что не так с представленными данными.
Решением этой проблемы (как было предложено в одном из комментариев) было заменить error_messages
на errors
. Я не знаю, откуда у меня появилась идея использовать error_messages
, но это была небольшая ошибка, приведшая к большому разочарованию.
Это привело к ошибке The submitted data was not a file. Check the encoding type on the form.
На самом деле мне нужно было определить запрос в разделе form-data в Postman с помощью выпадающего списка file. Это позволило мне выбрать файл с моего компьютера вместо повторного использования одного и того же S3 URL.