diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index 67776864a..b3ec39ac1 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -360,10 +360,11 @@ class AutoSchema(ViewInspector): # Nested Serializers, `many` or not. if isinstance(field, serializers.ListSerializer): + ref, components = self.map_serializer(field.child) return { 'type': 'array', - 'items': self.map_serializer(field.child) - }, {} + 'items': ref + }, components if isinstance(field, serializers.Serializer): data, components = self.map_serializer(field) return data, components diff --git a/tests/schemas/test_openapi.py b/tests/schemas/test_openapi.py index f17b90cfe..817be0835 100644 --- a/tests/schemas/test_openapi.py +++ b/tests/schemas/test_openapi.py @@ -353,6 +353,35 @@ class TestOperationIntrospection(TestCase): assert list(nested['properties'].keys()) == ['number'] assert nested['required'] == ['number'] + def test_response_body_list_serializer(self): + path = '/' + method = 'POST' + + class NestedSerializer(serializers.Serializer): + number = serializers.IntegerField() + text = serializers.CharField() + + class ItemSerializer(serializers.ListSerializer): + child = NestedSerializer() + + class MainSerializer(serializers.Serializer): + main = ItemSerializer() + + class View(generics.GenericAPIView): + serializer_class = MainSerializer + + view = create_view( + View, + method, + create_request(path), + ) + inspector = AutoSchema() + inspector.view = view + responses = inspector.get_responses(path, method) + assert responses['201']['content']['application/json']['schema']['$ref'] == '#/components/schemas/Main' + components = inspector.get_components(path, method) + assert sorted(list(components.keys())) == ['Main', 'Nested'] + def test_list_response_body_generation(self): """Test that an array schema is returned for list views.""" path = '/'