序列化上传的文件数据Django Rest Framework

时间:2017-07-04 11:05:00

标签: django serialization file-upload django-rest-framework

我正在尝试在Django Rest Framework中使用文件上传系统。

我要上传的文件是.gpx文件,它们是自定义xml文件。我不想将文件存储在数据库中,而是想从中提取信息然后将其输入到我的模型中。

我有一个函数,它接受一个临时文件,然后提取信息,然后根据需要创建模型元素。我要做的是在文件上传并传递给该函数之前对文件执行一些检查。

我该怎么做?

文件上传目前已完成,如文档(见下文)所示,这是一个通用的APIView和put命令。这非常有效,我只想知道在上传之前检查此文件的有效性的最佳方法是什么。

views.py

class FileUploadView(views.APIView):
    parser_classes = (FileUploadParser, )

    def put(self, request, filename, format=None):
        up_file = request.data['file']

        SaveGPXtoModel(up_file, request.user)

        return Response(status=204)

API应该进行这些检查还是假设文件已经过验证?

在Django中,这些检查将由表单处理,我应该使用序列化程序进行这些检查吗?

如果要使用序列化器,那么将一个文件作为输入并将各种数据点作为输出是否重要?

1 个答案:

答案 0 :(得分:3)

您可以先为您的文件编写序列化程序,但不必将其链接到模型:

class FileSerializer(serializers.Serializer):
    file = serializers.FileField()

fileField没有做任何具体检查。根据您需要检查的内容,添加自定义验证器并使用:

class FileSerializer(serializers.Serializer):
    file = serializers.FileField(validators=[validate_file])

有一个很好的例子,说明如何编写基于类的文件验证器here

然后在您的视图中使用序列化程序:

class FileUploadView(APIView):
    parser_classes = (MultiPartParser, )

    def post(self, request):
        serializer = FileSerializer(data=request.data)
        if not serializer.is_valid():
            return Response(
                data=serializer.errors,
                status=status.HTTP_400_BAD_REQUEST
            )
        ...