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:

Вернуться на верх