我正在尝试在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中,这些检查将由表单处理,我应该使用序列化程序进行这些检查吗?
如果要使用序列化器,那么将一个文件作为输入并将各种数据点作为输出是否重要?
答案 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
)
...