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

Dom*_*nic 6 django serialization file-upload django-rest-framework

我正在尝试让文件上传系统在 Django Rest Framework 中工作。

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

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

我该怎么做?

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

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

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

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

如果序列化程序是要走的路,那么有一个文件作为输入和各种数据点作为输出是否重要?

Duf*_*f59 10

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

class FileSerializer(serializers.Serializer):
    file = serializers.FileField()
Run Code Online (Sandbox Code Playgroud)

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

class FileSerializer(serializers.Serializer):
    file = serializers.FileField(validators=[validate_file])
Run Code Online (Sandbox Code Playgroud)

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

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

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