Support RecursiveField with 'many' option (#321)
parent
76c8fe0646
commit
e538e0713a
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue