Skip to content

Commit becb962

Browse files
Kentalotcarltongibson
authored andcommitted
OpenAPI: Use int64 format for large integers. (encode#7018)
1 parent 8b06ce7 commit becb962

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

rest_framework/schemas/openapi.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,13 @@ def _map_field(self, field):
268268
'items': {},
269269
}
270270
if not isinstance(field.child, _UnvalidatedField):
271-
mapping['items'] = {
272-
"type": self._map_field(field.child).get('type')
271+
map_field = self._map_field(field.child)
272+
items = {
273+
"type": map_field.get('type')
273274
}
275+
if 'format' in map_field:
276+
items['format'] = map_field.get('format')
277+
mapping['items'] = items
274278
return mapping
275279

276280
# DateField and DateTimeField type is string
@@ -340,6 +344,9 @@ def _map_field(self, field):
340344
'type': 'integer'
341345
}
342346
self._map_min_max(field, content)
347+
# 2147483647 is max for int32_size, so we use int64 for format
348+
if int(content.get('maximum', 0)) > 2147483647 or int(content.get('minimum', 0)) > 2147483647:
349+
content['format'] = 'int64'
343350
return content
344351

345352
if isinstance(field, serializers.FileField):

tests/schemas/test_openapi.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ def test_list_field_mapping(self):
5050
(serializers.ListField(child=serializers.BooleanField()), {'items': {'type': 'boolean'}, 'type': 'array'}),
5151
(serializers.ListField(child=serializers.FloatField()), {'items': {'type': 'number'}, 'type': 'array'}),
5252
(serializers.ListField(child=serializers.CharField()), {'items': {'type': 'string'}, 'type': 'array'}),
53+
(serializers.ListField(child=serializers.IntegerField(max_value=4294967295)),
54+
{'items': {'type': 'integer', 'format': 'int64'}, 'type': 'array'}),
55+
(serializers.IntegerField(min_value=2147483648),
56+
{'type': 'integer', 'minimum': 2147483648, 'format': 'int64'}),
5357
]
5458
for field, mapping in cases:
5559
with self.subTest(field=field):

0 commit comments

Comments
 (0)