Pyreadstat ожидал str, bytes или объект os.PathLike, а не InMemoryUploadedFile
Пытаюсь сделать конечную точку, которая может читать загруженный файл .sav (SPSS) и создавать из него модель с данными. Для получения данных из него я использую библиотеку pyreadstat. Но теперь, когда я пытаюсь запустить ее, у меня возникает ошибка expected str, bytes or os.PathLike object, not InMemoryUploadedFile
Как я могу изменить этот код, чтобы pyreadstat мог правильно прочитать заданный файл?
from rest_framework import generics, status
import pandas as pd
import pyreadstat
from rest_framework.response import Response
from .models import Research, Data
from .serializers import FileUploadSerializer, SaveFileSerializer
class UploadFileView(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']
df, meta = pyreadstat.read_sav(file, user_missing=True)
json_df = df.to_json(orient='table')
rsch = Research.objects.get(pk=1)
Data.objects.create(research=rsch, data={})
Изменить это:
pyreadstat.read_sav(file, user_missing=True)
К этому:
pyreadstat.read_sav(file.getvalue(), user_missing=True)
Надеемся, что это сработает.
Django загруженные файлы являются по большей части файлоподобными, и они проксируют только определенные методы. Смотрите FileProxyMixin
источник для более подробной информации о конкретных методах, если вам интересно.
В данном случае вы получаете InMemoryUploadFile
, но это может измениться, если Django решит записать данные на диск из-за слишком большого размера выгрузки.
Чтобы получить загруженное содержимое, используйте метод read()
:
file = serializer.validated_data['file']
contents = file.read()
df, meta = pyreadstat.read_sav(contents, user_missing=True)
Документация по объектам загруженных файлов django: