Django Rest Framework: Регистрация чистых представлений на основе функций в маршрутизаторе, чтобы они отображались в корне API

Это мой views.py:

class ChoicesViewSet(viewsets.ModelViewSet):
    queryset = SingleChoice.objects.all()
    serializer_class = SingleChoiceSerializer
    ...

class AssessmentTakersViewSet(viewsets.ModelViewSet):
    queryset = AssessmentTaker.objects.all()
    serializer_class = AssessmentTakersSerializer
    ...

@api_view(['POST'])
@parser_classes((JSONParser,))
def studio_create_view(request, format=None):
    """"
    A view that accept POST request with JSON content and in turn build out the 
    questions and choices. Post with application/json type.
    """
    ... 

Это мой urls.py:


urlpatterns = [
    # http://localhost:8000/survey/api/studio-create
    path('api/studio-create', views.studio_create_view, name='studio-create-api'),
]

# drf config
router = routers.DefaultRouter()

router.register('api/choices', views.ChoicesViewSet)
router.register('api/assessment-takers', views.AssessmentTakersViewSet)

urlpatterns += router.urls

Это работает функционально и считается завершенным, но поскольку studio-create_view не зарегистрирован в маршрутизаторе, путь не отображается в API Root, что не очень хорошо с точки зрения документации. Другими словами, корень API из Django Rest Framework не знает о пути, и GET запрос к корню выдаст только:

http://localhost:8000/survey/

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{

    "api/choices": "http://localhost:8000/survey/api/choices/",
    "api/assessment-takers": "http://localhost:8000/survey/api/assessment-takers/",
    ...
}

illustration

Мой вопрос заключается в том, вне наборов представлений, которые наследуются от ModelViewSet, как нам заставить пользовательские представления, такие как studio_create_view, быть зарегистрированными в маршрутизаторе, который Django Rest Framework предоставляет, чтобы они были указаны в корне API?

Можно было бы попробовать что-то вроде:

router.register('api/studio-create', views.studio_create_view, basename='studio-create-api')

Но это не сработает, выбросив следующее исключение:

AttributeError: объект 'function' не имеет атрибута 'get_extra_actions'

Отмена name или basename также не работает.

router.register('api/studio-create', views.studio_create_view)

Это заставит Django Rest Framework выбросить следующее исключение:

AssertionError: basename аргумент не указан, и не удалось автоматически определить имя из набора представлений, так как у него нет атрибута .queryset.

Обратите внимание, что пользовательская функция представления studio_create_view является функцией, а не классом, и поэтому не наследуется от других классов, так что подобные вопросы, где представление наследуется от viewsets.ViewSet или viewsets.ModelViewSet или чего-то подобного, вряд ли будут полезны. Буду признателен за любые подсказки, поскольку я безрезультатно изучил всю документацию

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