This commit is contained in:
Ivan Ng 2018-08-06 08:06:33 +00:00 committed by GitHub
commit c925f9fdce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 1 deletions

View File

@ -1026,6 +1026,8 @@ class ModelSerializer(Serializer):
field_names, declared_fields, extra_kwargs
)
extra_validators = self.get_extra_validators()
# Determine the fields that should be included on the serializer.
fields = OrderedDict()
@ -1050,6 +1052,13 @@ class ModelSerializer(Serializer):
field_kwargs, extra_field_kwargs
)
extra_field_validators = extra_validators.get(field_name, [])
# Include extra validators defined in `Meta.validators`
field_kwargs = self.include_extra_validators(
field_kwargs, extra_field_validators
)
# Create the serializer field.
fields[field_name] = field_class(**field_kwargs)
@ -1431,6 +1440,25 @@ class ModelSerializer(Serializer):
return extra_kwargs, hidden_fields
def include_extra_validators(self, kwargs, extra_validators):
"""
Include any 'extra_validators' that have been included for this field,
"""
print(kwargs.get('validators', []))
print(extra_validators)
validators = kwargs.get('validators', []) + extra_validators
if validators:
kwargs['validators'] = validators
return kwargs
def get_extra_validators(self):
"""
Return a dictionary mapping field names to a list of
additional validators.
"""
extra_validators = copy.deepcopy(getattr(self.Meta, 'extra_validators', {}))
return extra_validators
def _get_model_fields(self, field_names, declared_fields, extra_kwargs):
"""
Returns all the model fields that are being mapped to by fields

View File

@ -14,7 +14,8 @@ from collections import OrderedDict
import pytest
from django.core.exceptions import ImproperlyConfigured
from django.core.validators import (
MaxValueValidator, MinLengthValidator, MinValueValidator
EmailValidator, MaxValueValidator, MinLengthValidator, MinValueValidator,
URLValidator
)
from django.db import models
from django.test import TestCase
@ -286,6 +287,34 @@ class TestRegularFieldMappings(TestCase):
""")
self.assertEqual(repr(TestSerializer()), expected)
def test_extra_field_validators(self):
"""
Ensure `extra_validators` are included to generated fields.
"""
class ExtraValidatorsTestModel(models.Model):
int = models.IntegerField()
email = models.CharField(unique=True)
url = models.CharField(validators=[URLValidator()])
avatar = models.CharField()
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = ExtraValidatorsTestModel
fields = ('int', 'email', 'url', 'avatar')
extra_validators = {
'email': [EmailValidator()],
'avatar': [URLValidator()],
}
expected = dedent("""
TestSerializer():
int = IntegerField()
email = CharField(validators=[<django.core.validators.MaxLengthValidator object>, <UniqueValidator(queryset=ExtraValidatorsTestModel.objects.all())>, <django.core.validators.EmailValidator object>])
url = CharField(validators=[<django.core.validators.URLValidator object>, <django.core.validators.MaxLengthValidator object>])
avatar = CharField(validators=[<django.core.validators.MaxLengthValidator object>, <django.core.validators.URLValidator object>])
""")
self.assertEqual(repr(TestSerializer()), expected)
def test_invalid_field(self):
"""
Field names that do not map to a model field or relationship should