diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index d8707e1e1..ad19f6df8 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -525,7 +525,7 @@ class AutoSchema(ViewInspector): if isinstance(field, serializers.HiddenField): continue - if field.required: + if field.required and not serializer.partial: required.append(self.get_field_name(field)) schema = self.map_field(field) diff --git a/tests/schemas/test_openapi.py b/tests/schemas/test_openapi.py index 1eb5b84b7..6645cac72 100644 --- a/tests/schemas/test_openapi.py +++ b/tests/schemas/test_openapi.py @@ -403,6 +403,56 @@ class TestOperationIntrospection(TestCase): assert list(schema['properties']['nested']['properties'].keys()) == ['number'] assert schema['properties']['nested']['required'] == ['number'] + def test_response_body_partial_serializer(self): + path = '/' + method = 'GET' + + class ItemSerializer(serializers.Serializer): + text = serializers.CharField() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.partial = True + + class View(generics.GenericAPIView): + serializer_class = ItemSerializer + + view = create_view( + View, + method, + create_request(path), + ) + inspector = AutoSchema() + inspector.view = view + + responses = inspector.get_responses(path, method) + assert responses == { + '200': { + 'description': '', + 'content': { + 'application/json': { + 'schema': { + 'type': 'array', + 'items': { + '$ref': '#/components/schemas/Item' + }, + }, + }, + }, + }, + } + components = inspector.get_components(path, method) + assert components == { + 'Item': { + 'type': 'object', + 'properties': { + 'text': { + 'type': 'string', + }, + }, + } + } + def test_list_response_body_generation(self): """Test that an array schema is returned for list views.""" path = '/'