Skip to content

Commit 1cc4be4

Browse files
knivetscarltongibson
authored andcommitted
Fixed min/max attributes for serializers.ListField (encode#6866)
1 parent f8c1644 commit 1cc4be4

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

rest_framework/schemas/openapi.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ def _map_serializer(self, serializer):
377377
schema['default'] = field.default
378378
if field.help_text:
379379
schema['description'] = str(field.help_text)
380-
self._map_field_validators(field.validators, schema)
380+
self._map_field_validators(field, schema)
381381

382382
properties[field.field_name] = schema
383383

@@ -389,13 +389,11 @@ def _map_serializer(self, serializer):
389389

390390
return result
391391

392-
def _map_field_validators(self, validators, schema):
392+
def _map_field_validators(self, field, schema):
393393
"""
394394
map field validators
395-
:param list:validators: list of field validators
396-
:param dict:schema: schema that the validators get added to
397395
"""
398-
for v in validators:
396+
for v in field.validators:
399397
# "Formats such as "email", "uuid", and so on, MAY be used even though undefined by this specification."
400398
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#data-types
401399
if isinstance(v, EmailValidator):
@@ -405,9 +403,15 @@ def _map_field_validators(self, validators, schema):
405403
if isinstance(v, RegexValidator):
406404
schema['pattern'] = v.regex.pattern
407405
elif isinstance(v, MaxLengthValidator):
408-
schema['maxLength'] = v.limit_value
406+
attr_name = 'maxLength'
407+
if isinstance(field, serializers.ListField):
408+
attr_name = 'maxItems'
409+
schema[attr_name] = v.limit_value
409410
elif isinstance(v, MinLengthValidator):
410-
schema['minLength'] = v.limit_value
411+
attr_name = 'minLength'
412+
if isinstance(field, serializers.ListField):
413+
attr_name = 'minItems'
414+
schema[attr_name] = v.limit_value
411415
elif isinstance(v, MaxValueValidator):
412416
schema['maximum'] = v.limit_value
413417
elif isinstance(v, MinValueValidator):

tests/schemas/test_openapi.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,9 @@ def test_serializer_validators(self):
459459
assert properties['string']['minLength'] == 2
460460
assert properties['string']['maxLength'] == 10
461461

462+
assert properties['lst']['minItems'] == 2
463+
assert properties['lst']['maxItems'] == 10
464+
462465
assert properties['regex']['pattern'] == r'[ABC]12{3}'
463466
assert properties['regex']['description'] == 'must have an A, B, or C followed by 1222'
464467

tests/schemas/views.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ class ExampleValidatedSerializer(serializers.Serializer):
8585
),
8686
help_text='must have an A, B, or C followed by 1222'
8787
)
88+
lst = serializers.ListField(
89+
validators=(
90+
MaxLengthValidator(limit_value=10),
91+
MinLengthValidator(limit_value=2),
92+
)
93+
)
8894
decimal1 = serializers.DecimalField(max_digits=6, decimal_places=2)
8995
decimal2 = serializers.DecimalField(max_digits=5, decimal_places=0,
9096
validators=(DecimalValidator(max_digits=17, decimal_places=4),))

0 commit comments

Comments
 (0)