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/",
...
}
Мой вопрос заключается в том, вне наборов представлений, которые наследуются от 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
или чего-то подобного, вряд ли будут полезны. Буду признателен за любые подсказки, поскольку я безрезультатно изучил всю документацию