diff --git a/rest_framework/validators.py b/rest_framework/validators.py index a21f67e60..4d5820a98 100644 --- a/rest_framework/validators.py +++ b/rest_framework/validators.py @@ -8,6 +8,7 @@ object creation, and makes it possible to switch between using the implicit """ from __future__ import unicode_literals +from django.db import DataError from django.utils.translation import ugettext_lazy as _ from rest_framework.compat import unicode_to_repr @@ -59,7 +60,14 @@ class UniqueValidator(object): queryset = self.queryset queryset = self.filter_queryset(value, queryset) queryset = self.exclude_current_instance(queryset) - if queryset.exists(): + + # catch DataError for PostgrSQL fields + try: + exists = queryset.exists() + except DataError: + exists = False + + if exists: raise ValidationError(self.message) def __repr__(self): diff --git a/tests/test_validators.py b/tests/test_validators.py index acaaf5743..ad91f3271 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -15,6 +15,7 @@ def dedent(blocktext): class UniquenessModel(models.Model): username = models.CharField(unique=True, max_length=100) + ip = models.GenericIPAddressField(protocol='IPv4', unique=True, blank=True, null=True) class UniquenessSerializer(serializers.ModelSerializer): @@ -41,6 +42,7 @@ class TestUniquenessValidation(TestCase): UniquenessSerializer(): id = IntegerField(label='ID', read_only=True) username = CharField(max_length=100, validators=[]) + ip = IPAddressField(allow_null=True, required=False, validators=[, ]) """) assert repr(serializer) == expected @@ -73,6 +75,12 @@ class TestUniquenessValidation(TestCase): self.assertEqual( AnotherUniquenessModel._meta.get_field('code').validators, []) + def test_data_error(self): + data = {'ip': 'test', 'username': 'test'} + serializer = UniquenessSerializer(data=data) + assert not serializer.is_valid() + assert serializer.errors == {'ip': ['Enter a valid IPv4 address.', 'Enter a valid IPv4 or IPv6 address.']} + # Tests for `UniqueTogetherValidator` # -----------------------------------