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.

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