mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-02 11:30:12 +03:00
Merge 33642b3be4
into 5ad24b0811
This commit is contained in:
commit
c925f9fdce
|
@ -1026,6 +1026,8 @@ class ModelSerializer(Serializer):
|
||||||
field_names, declared_fields, extra_kwargs
|
field_names, declared_fields, extra_kwargs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
extra_validators = self.get_extra_validators()
|
||||||
|
|
||||||
# Determine the fields that should be included on the serializer.
|
# Determine the fields that should be included on the serializer.
|
||||||
fields = OrderedDict()
|
fields = OrderedDict()
|
||||||
|
|
||||||
|
@ -1050,6 +1052,13 @@ class ModelSerializer(Serializer):
|
||||||
field_kwargs, extra_field_kwargs
|
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.
|
# Create the serializer field.
|
||||||
fields[field_name] = field_class(**field_kwargs)
|
fields[field_name] = field_class(**field_kwargs)
|
||||||
|
|
||||||
|
@ -1431,6 +1440,25 @@ class ModelSerializer(Serializer):
|
||||||
|
|
||||||
return extra_kwargs, hidden_fields
|
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):
|
def _get_model_fields(self, field_names, declared_fields, extra_kwargs):
|
||||||
"""
|
"""
|
||||||
Returns all the model fields that are being mapped to by fields
|
Returns all the model fields that are being mapped to by fields
|
||||||
|
|
|
@ -14,7 +14,8 @@ from collections import OrderedDict
|
||||||
import pytest
|
import pytest
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.core.validators import (
|
from django.core.validators import (
|
||||||
MaxValueValidator, MinLengthValidator, MinValueValidator
|
EmailValidator, MaxValueValidator, MinLengthValidator, MinValueValidator,
|
||||||
|
URLValidator
|
||||||
)
|
)
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
@ -286,6 +287,34 @@ class TestRegularFieldMappings(TestCase):
|
||||||
""")
|
""")
|
||||||
self.assertEqual(repr(TestSerializer()), expected)
|
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):
|
def test_invalid_field(self):
|
||||||
"""
|
"""
|
||||||
Field names that do not map to a model field or relationship should
|
Field names that do not map to a model field or relationship should
|
||||||
|
|
Loading…
Reference in New Issue
Block a user