Skip to content

Commit ce491b3

Browse files
committed
Merge pull request #3568 from jpadilla/decimal-validator
Add compat util for DecimalValidator
2 parents 08e4a98 + 7d79cf3 commit ce491b3

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

rest_framework/compat.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ def apply_markdown(text):
185185
else:
186186
DurationField = duration_string = parse_duration = None
187187

188+
try:
189+
# DecimalValidator is unavailable in Django < 1.9
190+
from django.core.validators import DecimalValidator
191+
except ImportError:
192+
DecimalValidator = None
188193

189194
def set_rollback():
190195
if hasattr(transaction, 'set_rollback'):

rest_framework/utils/field_mapping.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from django.db import models
99
from django.utils.text import capfirst
1010

11+
from rest_framework.compat import DecimalValidator
1112
from rest_framework.validators import UniqueValidator
1213

1314
NUMERIC_FIELD_TYPES = (
@@ -132,7 +133,7 @@ def get_field_kwargs(field_name, model_field):
132133
if isinstance(model_field, models.DecimalField):
133134
validator_kwarg = [
134135
validator for validator in validator_kwarg
135-
if not isinstance(validator, validators.DecimalValidator)
136+
if DecimalValidator and not isinstance(validator, DecimalValidator)
136137
]
137138

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

tests/test_model_serializer.py

Lines changed: 39 additions & 1 deletion
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 unicode_repr
25+
from rest_framework.compat import DecimalValidator, unicode_repr
2626

2727

2828
def dedent(blocktext):
@@ -861,3 +861,41 @@ class Meta:
861861
}]
862862

863863
assert serializer.data == expected
864+
865+
866+
class DecimalFieldModel(models.Model):
867+
decimal_field = models.DecimalField(
868+
max_digits=3,
869+
decimal_places=1,
870+
validators=[MinValueValidator(1), MaxValueValidator(3)]
871+
)
872+
873+
874+
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):
878+
"""
879+
Test that a DecimalField has no validators before Django 1.9.
880+
"""
881+
class TestSerializer(serializers.ModelSerializer):
882+
class Meta:
883+
model = DecimalFieldModel
884+
885+
serializer = TestSerializer()
886+
887+
assert len(serializer.fields['decimal_field'].validators) == 0
888+
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):
892+
"""
893+
Test that a DecimalField has DecimalValidator in Django 1.9+.
894+
"""
895+
class TestSerializer(serializers.ModelSerializer):
896+
class Meta:
897+
model = DecimalFieldModel
898+
899+
serializer = TestSerializer()
900+
901+
assert len(serializer.fields['decimal_field'].validators) == 2

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy