Использование FileField с пользовательским интерфейсом Swagger и drf-впечатляющим

У меня есть проект Django REST Framework, в котором используется ModelViewSet для создания API-интерфейсов для модели, содержащей.

Я поделился полным примером проекта Django, демонстрирующим эту проблему здесь . Но резюмируем ключевые компоненты:

models.py

      from django.db import models


class Profile(models.Model):
    image = models.FileField(upload_to='uploads/%Y/%m/%d/')

views.py

      from rest_framework import (
    viewsets,
    serializers,
    parsers,
)

from sample import models


class ProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Profile
        fields = ['id', 'image']
        read_only_fields = ['id']


class ProfileViewSet(viewsets.ModelViewSet):
    serializer_class = ProfileSerializer
    queryset = models.Profile.objects.all()

urls.py

      from drf_spectacular.views import (
    SpectacularAPIView,
    SpectacularSwaggerView,
)

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings

from rest_framework.routers import DefaultRouter

from sample import views


router = DefaultRouter()
router.register('profile', views.ProfileViewSet)


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/schema/', SpectacularAPIView.as_view(), name='api-schema'),
    path(
        'api/docs/',
        SpectacularSwaggerView.as_view(url_name='api-schema'),
        name='api-docs',
    ),
    path('', include(router.urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py ( REST_FRAMEWORK только конфигурация):

      REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

requirements.txt

      Django==3.2.3
djangorestframework==3.12.4
drf-spectacular==0.16.0

Я создаю доступные для просмотра документы Swagger-UI, используя drf-spectular для документирования API.

Проблема в том, что FileField ввод в Swagger-UI - это string input и не дает возможности установить файл:

Я хотел бы иметь ввод файла, где я могу выбрать файл, который будет отправлен в API.

У меня вопрос: как я могу настроить DRF или drf-Spectrum для отображения этого поля?

1 ответ

После некоторого покопания в drf-впечатляющей документации и проблемах GitHub я обнаружил, что для FileField можно установить значение binary добавив в REST_FRAMEWORKв settings.py :

      REST_FRAMEWORK = {
    'COMPONENT_SPLIT_REQUEST': True
}
Другие вопросы по тегам