Skip to content

Commit eb9d311

Browse files
Daniel Alvarezcarltongibson
authored andcommitted
Added mapping of ListField.child type for OpenAPI Schemas.
1 parent da1c6d4 commit eb9d311

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

rest_framework/schemas/openapi.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from rest_framework import exceptions, serializers
1111
from rest_framework.compat import uritemplate
12-
from rest_framework.fields import empty
12+
from rest_framework.fields import _UnvalidatedField, empty
1313

1414
from .generators import BaseSchemaGenerator
1515
from .inspectors import ViewInspector
@@ -256,9 +256,14 @@ def _map_field(self, field):
256256

257257
# ListField.
258258
if isinstance(field, serializers.ListField):
259-
return {
259+
mapping = {
260260
'type': 'array',
261261
}
262+
if not isinstance(field.child, _UnvalidatedField):
263+
mapping['items'] = {
264+
"type": self._map_field(field.child).get('type')
265+
}
266+
return mapping
262267

263268
# DateField and DateTimeField type is string
264269
if isinstance(field, serializers.DateField):

tests/schemas/test_openapi.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,20 @@ def test_pagination(self):
3939
assert f.get_schema_operation_parameters(self.dummy_view)
4040

4141

42+
class TestFieldMapping(TestCase):
43+
def test_list_field_mapping(self):
44+
inspector = AutoSchema()
45+
cases = [
46+
(serializers.ListField(), {'type': 'array'}),
47+
(serializers.ListField(child=serializers.BooleanField()), {'items': {'type': 'boolean'}, 'type': 'array'}),
48+
(serializers.ListField(child=serializers.FloatField()), {'items': {'type': 'number'}, 'type': 'array'}),
49+
(serializers.ListField(child=serializers.CharField()), {'items': {'type': 'string'}, 'type': 'array'}),
50+
]
51+
for field, mapping in cases:
52+
with self.subTest(field=field):
53+
assert inspector._map_field(field) == mapping
54+
55+
4256
@pytest.mark.skipif(uritemplate is None, reason='uritemplate not installed.')
4357
class TestOperationIntrospection(TestCase):
4458

0 commit comments

Comments
 (0)