DRF-上传CSV文件,然后遍历每行

时间:2019-08-13 18:01:12

标签: django django-rest-framework

我不需要将文件保存到数据库,只需上传文件,这样我就可以遍历每一行并根据这些行中的数据执行一些操作。使用常规的Django视图,我可以像这样遍历CSV文件中的每一行:

class FileUploadForm(forms.Form):
    file = forms.FileField()

class ProductUpload(FormView):
    template_name = 'file_upload.html'
    form_class = FileUploadForm

    def form_valid(self, form):
        file = form.cleaned_data['file']
        decoded_file = file.read().decode()
        io_string = io.StringIO(file)
        reader = csv.reader(io_string)
        for row in reader:
            print(row)
        messages.success(self.request, 'File uploaded successfully.')
        return redirect(self.request.path)

但是我无法使用Django Rest Framework弄清楚。我正在使用parsers.FileUploadParser,但不确定是否正确-表单将通过前端的浏览器提交。

class ProductUploadAPIView(views.APIView):
    parser_classes = (parsers.FileUploadParser,)

    def post(self, request, *args, **kwargs):
        file = request.data['file']
        decoded_file = file.read().decode()
        # upload_products_csv.delay(decoded_file, request.user.pk)
        io_string = io.StringIO(decoded_file)
        reader = csv.reader(io_string)
        for row in reader:
            print(row)
        return Response(status=status.HTTP_204_NO_CONTENT)

这是我的cURL请求和控制台输出

curl -v -X POST -u user:pass http://localhost:8000/api/file_upload/ -F "file=./file.csv" -H "Content-Type: text/csv" -H "Content-Disposition: attachment; filename=file.csv"

['--------------------------8e8e5ed08fe4ca99']
['Content-Disposition: attachment; name="file"']
[]
['./file.csv']
['--------------------------8e8e5ed08fe4ca99--']

1 个答案:

答案 0 :(得分:0)

我只需要使用带有serializers.FileField的串行器而不是解析器。

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

    class Meta:
        fields = ('file',)

class FileUploadAPIView(generics.CreateAPIView):
    serializer_class = FileUploadSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        file = serializer.validated_data['file']
        decoded_file = file.read().decode()
        # upload_products_csv.delay(decoded_file, request.user.pk)
        io_string = io.StringIO(decoded_file)
        reader = csv.reader(io_string)
        for row in reader:
            print(row)
        return Response(status=status.HTTP_204_NO_CONTENT)