mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-04-25 11:33:43 +03:00
Case insensitive uniqueness validation (#4534)
This commit is contained in:
parent
0b373be712
commit
883efbc19f
|
@ -61,6 +61,7 @@ It takes a single required argument, and an optional `messages` argument:
|
||||||
|
|
||||||
* `queryset` *required* - This is the queryset against which uniqueness should be enforced.
|
* `queryset` *required* - This is the queryset against which uniqueness should be enforced.
|
||||||
* `message` - The error message that should be used when validation fails.
|
* `message` - The error message that should be used when validation fails.
|
||||||
|
* `lookup` - The lookup used to find an existing instance with the value being validated. Defaults to `'exact'`.
|
||||||
|
|
||||||
This validator should be applied to *serializer fields*, like so:
|
This validator should be applied to *serializer fields*, like so:
|
||||||
|
|
||||||
|
|
|
@ -42,10 +42,11 @@ class UniqueValidator(object):
|
||||||
"""
|
"""
|
||||||
message = _('This field must be unique.')
|
message = _('This field must be unique.')
|
||||||
|
|
||||||
def __init__(self, queryset, message=None):
|
def __init__(self, queryset, message=None, lookup='exact'):
|
||||||
self.queryset = queryset
|
self.queryset = queryset
|
||||||
self.serializer_field = None
|
self.serializer_field = None
|
||||||
self.message = message or self.message
|
self.message = message or self.message
|
||||||
|
self.lookup = lookup
|
||||||
|
|
||||||
def set_context(self, serializer_field):
|
def set_context(self, serializer_field):
|
||||||
"""
|
"""
|
||||||
|
@ -62,7 +63,7 @@ class UniqueValidator(object):
|
||||||
"""
|
"""
|
||||||
Filter the queryset to all instances matching the given attribute.
|
Filter the queryset to all instances matching the given attribute.
|
||||||
"""
|
"""
|
||||||
filter_kwargs = {self.field_name: value}
|
filter_kwargs = {'%s__%s' % (self.field_name, self.lookup): value}
|
||||||
return qs_filter(queryset, **filter_kwargs)
|
return qs_filter(queryset, **filter_kwargs)
|
||||||
|
|
||||||
def exclude_current_instance(self, queryset):
|
def exclude_current_instance(self, queryset):
|
||||||
|
|
|
@ -31,7 +31,7 @@ class RelatedModel(models.Model):
|
||||||
|
|
||||||
class RelatedModelSerializer(serializers.ModelSerializer):
|
class RelatedModelSerializer(serializers.ModelSerializer):
|
||||||
username = serializers.CharField(source='user.username',
|
username = serializers.CharField(source='user.username',
|
||||||
validators=[UniqueValidator(queryset=UniquenessModel.objects.all())]) # NOQA
|
validators=[UniqueValidator(queryset=UniquenessModel.objects.all(), lookup='iexact')]) # NOQA
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = RelatedModel
|
model = RelatedModel
|
||||||
|
@ -103,7 +103,7 @@ class TestUniquenessValidation(TestCase):
|
||||||
AnotherUniquenessModel._meta.get_field('code').validators, [])
|
AnotherUniquenessModel._meta.get_field('code').validators, [])
|
||||||
|
|
||||||
def test_related_model_is_unique(self):
|
def test_related_model_is_unique(self):
|
||||||
data = {'username': 'existing', 'email': 'new-email@example.com'}
|
data = {'username': 'Existing', 'email': 'new-email@example.com'}
|
||||||
rs = RelatedModelSerializer(data=data)
|
rs = RelatedModelSerializer(data=data)
|
||||||
self.assertFalse(rs.is_valid())
|
self.assertFalse(rs.is_valid())
|
||||||
self.assertEqual(rs.errors,
|
self.assertEqual(rs.errors,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user