diff --git a/docs/api-guide/schemas.md b/docs/api-guide/schemas.md index b4832b369..e1a5990e2 100644 --- a/docs/api-guide/schemas.md +++ b/docs/api-guide/schemas.md @@ -375,6 +375,16 @@ operationIds. In order to work around this, you can override `get_operation_id_base()` to provide a different base for name part of the ID. +#### `is_valid_serializer()` + +Returns true if a serializer instance will produce a valid component schema +for describing request and response bodies. The default behavior is to return +'True' for any Serializer instance. + +If you have a custom subclass of BaseSerializer which is capable of producing +a component schema, you can use that component schema by overrideing this method +(along with `map_serializer()`). + ### `AutoSchema.__init__()` kwargs `AutoSchema` provides a number of `__init__()` kwargs that can be used for diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index 4ecb7a65f..edee7e637 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -194,7 +194,7 @@ class AutoSchema(ViewInspector): serializer = self.get_serializer(path, method) - if not isinstance(serializer, serializers.Serializer): + if not self.is_valid_serializer(serializer): return {} component_name = self.get_component_name(serializer) @@ -626,7 +626,7 @@ class AutoSchema(ViewInspector): serializer = self.get_serializer(path, method) - if not isinstance(serializer, serializers.Serializer): + if not self.is_valid_serializer(serializer): item_schema = {} else: item_schema = self._get_reference(serializer) @@ -650,7 +650,7 @@ class AutoSchema(ViewInspector): serializer = self.get_serializer(path, method) - if not isinstance(serializer, serializers.Serializer): + if not self.is_valid_serializer(serializer): item_schema = {} else: item_schema = self._get_reference(serializer) @@ -692,6 +692,10 @@ class AutoSchema(ViewInspector): return [path.split('/')[0].replace('_', '-')] + def is_valid_serializer(self, serializer): + # return True if the serializer produces a valid component schema + return isinstance(serializer, serializers.Serializer) + def _get_path_parameters(self, path, method): warnings.warn( "Method `_get_path_parameters()` has been renamed to `get_path_parameters()`. "