diff --git a/docs/openapi.rst b/docs/openapi.rst index 3669d3d..00ab528 100644 --- a/docs/openapi.rst +++ b/docs/openapi.rst @@ -174,6 +174,15 @@ in a few ways: :ref:`@swagger_auto_schema `, to prevent ``get_serializer`` from being called on the view * :ref:`exclude your endpoint from introspection ` +* use the ``swagger_fake_view`` marker to detect requests generated by ``drf-yasg``: + + .. code-block:: python + + def get_serializer_class(self): + if getattr(self, 'swagger_fake_view', False): + return TodoTreeSerializer + + raise NotImplementedError("must not call this") .. _SCRIPT_NAME: https://www.python.org/dev/peps/pep-0333/#environ-variables .. _FORCE_SCRIPT_NAME: https://docs.djangoproject.com/en/2.0/ref/settings/#force-script-name diff --git a/src/drf_yasg/generators.py b/src/drf_yasg/generators.py index c087e10..b551eaf 100644 --- a/src/drf_yasg/generators.py +++ b/src/drf_yasg/generators.py @@ -243,6 +243,8 @@ class OpenAPISchemaGenerator(object): view_method = getattr(view, method, None) if view_method is not None: # pragma: no cover setattr(view_method.__func__, '_swagger_auto_schema', overrides) + + setattr(view, 'swagger_fake_view', True) return view def get_endpoints(self, request): diff --git a/testproj/todo/views.py b/testproj/todo/views.py index a882de0..f778d70 100644 --- a/testproj/todo/views.py +++ b/testproj/todo/views.py @@ -33,7 +33,12 @@ class NestedTodoView(RetrieveAPIView): class TodoTreeView(viewsets.ReadOnlyModelViewSet): queryset = TodoTree.objects.all() - serializer_class = TodoTreeSerializer + + def get_serializer_class(self): + if getattr(self, 'swagger_fake_view', False): + return TodoTreeSerializer + + raise NotImplementedError("must not call this") class TodoRecursiveView(viewsets.ModelViewSet):