Django REST - 无效数据。需要一本字典,但得到的是 {datatype}

Cal*_*leb 5 django rest http django-rest-framework

我正在使用 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}."
}
Run Code Online (Sandbox Code Playgroud)

我在终端中没有看到任何其他有用的信息,仅此而已。

我的模型是这样的:

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
Run Code Online (Sandbox Code Playgroud)

我的序列化器是这样的:

from rest_framework import serializers
from .models import File

class FileSerializer(serializers.ModelSerializer):
    class Meta:
        model = File
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

到目前为止我的观点是这样的:

@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)
Run Code Online (Sandbox Code Playgroud)

归根结底是调用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"
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经在正文中提交了这些数据(仅更改了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"
}
Run Code Online (Sandbox Code Playgroud)

请,任何帮助将不胜感激,我花了一天时间试图找出提交的数据有什么问题。

Cal*_*leb 2

解决方案(如评论中所建议的)是将 替换error_messageserrors. 我不确定我从哪里得到了这个想法error_messages,但这是一个小错误,导致了很多挫败感。

这导致了错误,我实际上需要使用文件下拉列表在Postman 的表单数据The submitted data was not a file. Check the encoding type on the form.部分中定义请求。这使我能够从计算机中选择一个文件,而不是重复使用相同的 S3 URL。