aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/validators.py
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework/validators.py')
-rw-r--r--rest_framework/validators.py22
1 files changed, 18 insertions, 4 deletions
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)