From 0a1266b550f2376ce1e92412806436ff6fa8b812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Tue, 23 Jan 2018 21:06:24 +0100 Subject: [PATCH] Represent serializer DictField as an Object in schema DictFields were incorrectly being output as String in the schema. This pull request outputs an Object instead and adds a unit test. --- rest_framework/schemas/inspectors.py | 5 +++++ tests/test_schemas.py | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/rest_framework/schemas/inspectors.py b/rest_framework/schemas/inspectors.py index 2afef7a04..1b383fd18 100644 --- a/rest_framework/schemas/inspectors.py +++ b/rest_framework/schemas/inspectors.py @@ -34,6 +34,11 @@ def field_to_schema(field): title=title, description=description ) + elif isinstance(field, serializers.DictField): + return coreschema.Object( + title=title, + description=description + ) elif isinstance(field, serializers.Serializer): return coreschema.Object( properties=OrderedDict([ diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 34cb20798..41fcc74d8 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -51,6 +51,10 @@ class ExampleSerializer(serializers.Serializer): hidden = serializers.HiddenField(default='hello') +class AnotherSerializerWithDictField(serializers.Serializer): + a = serializers.DictField() + + class AnotherSerializerWithListFields(serializers.Serializer): a = serializers.ListField(child=serializers.IntegerField()) b = serializers.ListSerializer(child=serializers.CharField()) @@ -74,6 +78,13 @@ class ExampleViewSet(ModelViewSet): """ return super(ExampleSerializer, self).retrieve(self, request) + @detail_route(methods=['post'], serializer_class=AnotherSerializerWithDictField) + def custom_action_with_dict_field(self, request, pk): + """ + A custom action using a dict field in the serializer. + """ + return super(ExampleSerializer, self).retrieve(self, request) + @detail_route(methods=['post'], serializer_class=AnotherSerializerWithListFields) def custom_action_with_list_fields(self, request, pk): """ @@ -200,6 +211,16 @@ class TestRouterGeneratedSchema(TestCase): coreapi.Field('d', required=False, location='form', schema=coreschema.String(title='D')), ] ), + 'custom_action_with_dict_field': coreapi.Link( + url='/example/{id}/custom_action_with_dict_field/', + action='post', + encoding='application/json', + description='A custom action using a dict field in the serializer.', + fields=[ + coreapi.Field('id', required=True, location='path', schema=coreschema.String()), + coreapi.Field('a', required=True, location='form', schema=coreschema.Object(title='A')), + ] + ), 'custom_action_with_list_fields': coreapi.Link( url='/example/{id}/custom_action_with_list_fields/', action='post',