diff --git a/src/drf_yasg/inspectors/field.py b/src/drf_yasg/inspectors/field.py index b5af672..080e130 100644 --- a/src/drf_yasg/inspectors/field.py +++ b/src/drf_yasg/inspectors/field.py @@ -794,10 +794,19 @@ else: if isinstance(field, RecursiveField) and swagger_object_type == openapi.Schema: assert use_references is True, "Can not create schema for RecursiveField when use_references is False" - ref_name = get_serializer_ref_name(field.proxied) - assert ref_name is not None, "Can't create RecursiveField schema for inline " + str(type(field.proxied)) + proxied = field.proxied + if isinstance(field.proxied, serializers.ListSerializer): + proxied = proxied.child + + ref_name = get_serializer_ref_name(proxied) + assert ref_name is not None, "Can't create RecursiveField schema for inline " + str(type(proxied)) definitions = self.components.with_scope(openapi.SCHEMA_DEFINITIONS) - return openapi.SchemaRef(definitions, ref_name, ignore_unresolved=True) + + ref = openapi.SchemaRef(definitions, ref_name, ignore_unresolved=True) + if isinstance(field.proxied, serializers.ListSerializer): + ref = openapi.Items(type=openapi.TYPE_ARRAY, items=ref) + + return ref return NotHandled diff --git a/testproj/todo/serializer.py b/testproj/todo/serializer.py index c831395..309e582 100644 --- a/testproj/todo/serializer.py +++ b/testproj/todo/serializer.py @@ -41,10 +41,11 @@ class TodoYetAnotherSerializer(serializers.ModelSerializer): class TodoTreeSerializer(serializers.ModelSerializer): children = serializers.ListField(child=RecursiveField(), source='children.all') + many_children = RecursiveField(many=True, source='children') class Meta: model = TodoTree - fields = ('id', 'title', 'children') + fields = ('id', 'title', 'children', 'many_children') class TodoRecursiveSerializer(serializers.ModelSerializer): diff --git a/tests/reference.yaml b/tests/reference.yaml index c66ce86..7da4d79 100644 --- a/tests/reference.yaml +++ b/tests/reference.yaml @@ -1617,6 +1617,7 @@ definitions: required: - title - children + - many_children type: object properties: id: @@ -1632,6 +1633,10 @@ definitions: type: array items: $ref: '#/definitions/TodoTree' + many_children: + type: array + items: + $ref: '#/definitions/TodoTree' TodoYetAnother: required: - title