From fd7db776addbd5e30f132fe6846ec5c5caab5c40 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 10 Nov 2014 12:32:03 +0000 Subject: Bring UniqueValidator implementation in line with other uniquness validators. --- rest_framework/validators.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'rest_framework/validators.py') diff --git a/rest_framework/validators.py b/rest_framework/validators.py index d7f847aa..fa4f1847 100644 --- a/rest_framework/validators.py +++ b/rest_framework/validators.py @@ -35,12 +35,26 @@ class UniqueValidator: # Determine the existing instance, if this is an update operation. self.instance = getattr(serializer_field.parent, 'instance', None) - def __call__(self, value): - # Ensure uniqueness. + def filter_queryset(self, value, queryset): + """ + Filter the queryset to all instances matching the given attribute. + """ filter_kwargs = {self.field_name: value} - queryset = self.queryset.filter(**filter_kwargs) + return queryset.filter(**filter_kwargs) + + def exclude_current_instance(self, queryset): + """ + If an instance is being updated, then do not include + that instance itself as a uniqueness conflict. + """ if self.instance is not None: - queryset = queryset.exclude(pk=self.instance.pk) + return queryset.exclude(pk=self.instance.pk) + return queryset + + def __call__(self, value): + queryset = self.queryset + queryset = self.filter_queryset(value, queryset) + queryset = self.exclude_current_instance(queryset) if queryset.exists(): raise ValidationError(self.message) -- cgit v1.2.3