Support RecursiveField with 'many' option (#321)

master
Roman Sichny 2019-02-25 20:59:35 +02:00 committed by Cristi Vîjdea
parent 76c8fe0646
commit e538e0713a
3 changed files with 19 additions and 4 deletions

View File

@ -794,10 +794,19 @@ else:
if isinstance(field, RecursiveField) and swagger_object_type == openapi.Schema: 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" assert use_references is True, "Can not create schema for RecursiveField when use_references is False"
ref_name = get_serializer_ref_name(field.proxied) proxied = field.proxied
assert ref_name is not None, "Can't create RecursiveField schema for inline " + str(type(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) 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 return NotHandled

View File

@ -41,10 +41,11 @@ class TodoYetAnotherSerializer(serializers.ModelSerializer):
class TodoTreeSerializer(serializers.ModelSerializer): class TodoTreeSerializer(serializers.ModelSerializer):
children = serializers.ListField(child=RecursiveField(), source='children.all') children = serializers.ListField(child=RecursiveField(), source='children.all')
many_children = RecursiveField(many=True, source='children')
class Meta: class Meta:
model = TodoTree model = TodoTree
fields = ('id', 'title', 'children') fields = ('id', 'title', 'children', 'many_children')
class TodoRecursiveSerializer(serializers.ModelSerializer): class TodoRecursiveSerializer(serializers.ModelSerializer):

View File

@ -1617,6 +1617,7 @@ definitions:
required: required:
- title - title
- children - children
- many_children
type: object type: object
properties: properties:
id: id:
@ -1632,6 +1633,10 @@ definitions:
type: array type: array
items: items:
$ref: '#/definitions/TodoTree' $ref: '#/definitions/TodoTree'
many_children:
type: array
items:
$ref: '#/definitions/TodoTree'
TodoYetAnother: TodoYetAnother:
required: required:
- title - title