Django Rest Framework загружает файл в метод

Поэтому я пытался загрузить файл в метод с использованием DRF, пока не повезло.

Я смог загрузить в ModelViewSet используя (FormParser, MultiPartParser,) без проблем, но мне действительно нужно использовать его примерно так http://localhost:8000/api/v1/women/{pk}/upload_avatar/ где я хочу сначала отфильтровать женщину по id и загрузить ее аватар (который является внешним ключом к мультимедийной модели). Я попытался использовать библиотеку вложенных ресурсов без везения.

Пока что у меня в моем modelviewset:

 class WomenNativePassportViewSet(viewsets.ModelViewSet): queryset = Women.objects.all() serializer_class = WomenNativePassportSerializer authentication_classes = (NoAuthentication,) permission_classes = (AllowAny,) parser_classes = (FormParser, MultiPartParser,) @detail_route( methods=['post', 'put', 'patch', 'get'], permission_classes=[AllowAny], authentication_classes=[NoAuthentication], serializer_class=MultimediaSerializer, parser_classes=(FormParser, MultiPartParser,) ) def upload_avatar(self, request, pk=None, *args, **kwargs): if 'POST' in request._method or 'PATCH' in request._method: # Write code to save the file?? else: multimedia = Multimedia.objects.filter(user_profiles_avatares__pk=pk) page = self.paginate_queryset(multimedia) serializer = self.get_pagination_serializer(page) return Response(serializer.data) 

Мои модели:

 class Women(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL) avatar = models.ForeignKey( 'core.Multimedia', blank=True, null=True, related_name='user_profiles_avatares' ) class Multimedia(models.Model): file = models.FileField(upload_to=upload_to, null=True, blank=True) thumbnail = models.FileField(upload_to=upload_to, null=True, blank=True) 

В основном я хочу знать, является ли это правильным путем, который я принимаю, и если да, то как я могу правильно сохранить загруженный файл в модели?

2 Solutions collect form web for “Django Rest Framework загружает файл в метод”

Вот какой код я сделал для решения этой проблемы. Хотя ответ Кевина Брауна, вероятно, работает, я считаю, что мой код немного «проще»:

  @detail_route( methods=['post', 'put', 'patch', 'get'], permission_classes=[AllowAny], authentication_classes=[NoAuthentication], serializer_class=MultimediaSerializer, parser_classes=(FormParser, MultiPartParser,) ) def upload_avatar(self, request, pk=None): # Because we are using nested resources this was the only way i found to # upload a file. Maybe there is a better way if request.method in ['PATCH', 'POST']: avatar = request.FILES.get('avatar') if not avatar: return Response(status=404) try: woman = WomenNativePassport.objects.get(pk=pk) except WomenNativePassport.DoesNotExist: return Response(status=404) else: request.FILES['thumbnail'] = request.FILES['avatar'] serializer = AvatarSerializer( data=request.DATA, files=request.FILES ) if serializer.is_valid(): woman.avatar.thumbnail.save(str(avatar), File(avatar)) return Response(status=204) else: return Response(status=404) else: multimedia = Multimedia.objects.filter(user_profiles_avatares__pk=pk) page = self.paginate_queryset(multimedia) serializer = self.get_pagination_serializer(page) return Response(serializer.data) # serializer class AvatarSerializer(serializers.Serializer): thumbnail = serializers.ImageField() 

Любые загруженные файлы должны быть доступны в request.FILES , словарь, на который указывает поле, которое они использовали при загрузке. После того, как у вас есть файл, это вопрос обработки его, как и любого другого загруженного файла в Django .

Если вы можете, я бы использовал второй сериализатор, который обертывает модель Multimedia чтобы проверка и сохранение изображения могли выполняться автоматически через Django REST Framework. Существует ImageField , который автоматически проверяет изображение на Pillow которое вы можете использовать в сериализаторе.

  • Почему Django Rest Framework препятствует проверке уровня модели?
  • Как использовать login_required в режиме просмотра django
  • Добавление API APIView в Django REST Framework Browsable API
  • Django REST Framework Создание пользовательского пользователя
  • Оптимизация запросов к базе данных в структуре Django REST
  • Создание API REST для python
  • Django-rest-framework @detail_route для определенного URL-адреса
  • CSRF Exempt Failure - APIView csrf django rest framework
  • используя фреймворк django rest для возврата информации по имени
  • Тест для поддержки как JSON, так и многофайлов файлов в DRF
  • Python Django Rest Framework UnorderedObjectListWarning
  •  
    Interesting Posts for Van-Lav

    Python: учитывая дату и день недели, найдите дату следующего появления заданного рабочего дня

    Преобразование строки в кортеж в python

    Код даты и времени Condense, Hook Appindicator3 Вызов меню + Относительный путь значка, Обзор кода

    Что произойдет, если два скрипта python захотят записать в одном файле?

    Как проверить, может ли строка быть подвергнута типу для float в Python?

    Дизайн Django для экранов веб-аналитики, которые занимают очень много времени, чтобы вычислить

    Является ли смешивание Clojure с Python хорошей идеей?

    Подпроцесс Python возвращает «команда не найдена», терминал выполняется правильно

    Как я могу получить путь к папке% APPDATA% в Python?

    Подсчет числа определенных слов в кадре данных панд

    numpy.sum может быть медленнее, чем Python for-loop

    Запросить выравнивание UAC из сценария Python?

    Как атомные операции монгоингина

    Как создать новый файл на удаленном узле в базе данных (средство развертывания python)?

    Параллельные асинхронные процессы с Python, Flask и Celery

    Python - лучший язык программирования в мире.