Q:

Чтение файла после загрузки в Django Rest Framework

Пишу библиотеку fb2 книжек на DRF. В моем проекте есть 2 модели: Для файла
class File(models.Model):
file = models.FileField(upload_to="books//%Y/%m/")
owner = models.ForeignKey('auth.User', related_name='uploaded_files', on_delete=models.CASCADE)

и для условной книги
class Book(models.Model):
    filename = models.CharField(max_length=100)
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    year = models.IntegerField()
    path = models.TextField()
    isbn = models.CharField(max_length=100)
    tags = models.TextField(max_length=200)
    last_access = models.BinaryField()
    cover_image = models.BinaryField()
    upload_date = models.DateTimeField(auto_now=True, db_index=True)
    owner = models.ForeignKey('auth.User', related_name='uploaded_files', on_delete=models.CASCADE)
    size = models.IntegerField(default=0)

Сериализатор и view для модели файлов из документации:
class FileSerializer(serializers.ModelSerializer):
class Meta:
    model = File
    fields = "__all__"

# ---view----
class FileViewSet(viewsets.ModelViewSet):
    queryset = File.objects.all()
    serializer_class = FileSerializer
    permission_classes = [permissions.IsAuthenticated]

Собственно, вопрос в том, как мне скормить загруженный файл автоматически написанному уже парсеру? Т.е. пришел POST запрос, содержащий файлик, я скормил его написанной библиотеке, заполнил поля модели Книги и сохранил ее.
Возможно ли это сделать, использую viewset или мне придется ручками описать кастомное представление?

A:

Все оказалось несложно. ViewSet использовать не получится, придется наследовать APIView и сделать примерно вот так.
class AddFile(APIView):

    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, *args, **kwargs):
        file_serializer = FileSerializer(data=request.data)
        if file_serializer.is_valid():
            file_serializer.save()
            file_path = media_root + file_serializer.data['file']
            with open(file_path, 'r') as f:
                # do something with file
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

