Skip to content

Commit dceb686

Browse files
committed
Merge pull request #3774 from tomchristie/decimalfield_validators
Min/MaxValueValidator is no longer transferred from a model's DecimalField
2 parents 060444d + a772326 commit dceb686

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

rest_framework/utils/field_mapping.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ def get_field_kwargs(field_name, model_field):
130130

131131
# Our decimal validation is handled in the field code, not validator code.
132132
# (In Django 1.9+ this differs from previous style)
133-
if isinstance(model_field, models.DecimalField):
133+
if isinstance(model_field, models.DecimalField) and DecimalValidator:
134134
validator_kwarg = [
135135
validator for validator in validator_kwarg
136-
if DecimalValidator and not isinstance(validator, DecimalValidator)
136+
if not isinstance(validator, DecimalValidator)
137137
]
138138

139139
# Ensure that max_length is passed explicitly as a keyword arg,

tests/test_model_serializer.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from rest_framework import serializers
2424
from rest_framework.compat import DurationField as ModelDurationField
25-
from rest_framework.compat import DecimalValidator, unicode_repr
25+
from rest_framework.compat import unicode_repr
2626

2727

2828
def dedent(blocktext):
@@ -872,30 +872,40 @@ class DecimalFieldModel(models.Model):
872872

873873

874874
class TestDecimalFieldMappings(TestCase):
875-
@pytest.mark.skipif(DecimalValidator is not None,
876-
reason='DecimalValidator is available in Django 1.9+')
877-
def test_decimal_field_has_no_decimal_validator(self):
875+
def test_decimal_field_has_decimal_validator(self):
878876
"""
879-
Test that a DecimalField has no validators before Django 1.9.
877+
Test that a `DecimalField` has no `DecimalValidator`.
880878
"""
881879
class TestSerializer(serializers.ModelSerializer):
882880
class Meta:
883881
model = DecimalFieldModel
884882

885883
serializer = TestSerializer()
886884

887-
assert len(serializer.fields['decimal_field'].validators) == 0
885+
assert len(serializer.fields['decimal_field'].validators) == 2
888886

889-
@pytest.mark.skipif(DecimalValidator is None,
890-
reason='DecimalValidator is available in Django 1.9+')
891-
def test_decimal_field_has_decimal_validator(self):
887+
def test_min_value_is_passed(self):
892888
"""
893-
Test that a DecimalField has DecimalValidator in Django 1.9+.
889+
Test that the `MinValueValidator` is converted to the `min_value`
890+
argument for the field.
894891
"""
895892
class TestSerializer(serializers.ModelSerializer):
896893
class Meta:
897894
model = DecimalFieldModel
898895

899896
serializer = TestSerializer()
900897

901-
assert len(serializer.fields['decimal_field'].validators) == 2
898+
assert serializer.fields['decimal_field'].min_value == 1
899+
900+
def test_max_value_is_passed(self):
901+
"""
902+
Test that the `MaxValueValidator` is converted to the `max_value`
903+
argument for the field.
904+
"""
905+
class TestSerializer(serializers.ModelSerializer):
906+
class Meta:
907+
model = DecimalFieldModel
908+
909+
serializer = TestSerializer()
910+
911+
assert serializer.fields['decimal_field'].max_value == 3

0 commit comments

Comments
 (0)