我不需要将文件保存到数据库,只需上传文件,这样我就可以遍历每一行并根据这些行中的数据执行一些操作。使用常规的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--']
答案 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)