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 RESTful API error "Тип объекта« Пользователь »не имеет атрибута« _meta »»
  • django-rest-framework 3.0 создавать или обновлять в вложенном сериализаторе
  • Регистрация запросов к django-rest-framework
  • Как показать параметры параметров запроса в Django REST Framework - Swagger
  • Загрузить файл с помощью Django Rest Framework
  • Как включить связанные поля модели с помощью Django Rest Framework?
  • Вложенной сериализатор полей - данные отсутствуют
  • Переопределение Django REST ViewSet с пользовательским методом и моделью
  •  
    Interesting Posts for Van-Lav

    Опять же: UnicodeEncodeError: ascii codec не может кодировать

    Как добавить визуальные аннотации к изображению с помощью python в ноутбуке jupyter?

    Недействительный старый сеанс в Flask

    aiohttp – исключение игнорируется сообщение

    «Нет модуля с именем« _ <module> »при импорте модуля SWIG со встроенным Python

    График обновления Live Matplotlib

    Как поставить легенду на первый подзаголовок морского берега.FacetGrid?

    Пирамиды route_url с дополнительными аргументами запроса

    Каков рекомендуемый способ построения: matplotlib или pylab?

    Python и libpcap. найти исходный mac-адрес пакета

    Использование нескольких ключевых слов в xattr через _kMDItemUserTags или kMDItemOMUserTags

    python: os.path.isdir возвращает false для каталога с точкой на конце

    Запускать скрипт python как демон во время загрузки (Ubuntu)

    Может ли SQLAlchemy's session.merge () обновить свой результат с новыми данными из базы данных?

    Python – переменная класса доступа из экземпляра

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