From 8547dbcbc59ee29957022f34d88dd903e5383619 Mon Sep 17 00:00:00 2001 From: Andrew Pinkham Date: Sat, 22 Dec 2018 16:56:57 +0100 Subject: [PATCH] Allow UniqueForXValidators to use instance data --- rest_framework/validators.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/rest_framework/validators.py b/rest_framework/validators.py index 444d4d497..5cb98a552 100644 --- a/rest_framework/validators.py +++ b/rest_framework/validators.py @@ -215,6 +215,17 @@ class BaseUniqueForValidator(object): if missing_items: raise ValidationError(missing_items, code='required') + def _get_field_values(self, attrs): + """Returns tuple (value, date_value) from attrs or instance""" + value = attrs.get(self.field) + date_value = attrs.get(self.date_field) + if hasattr(self, "instance") and self.instance is not None: + if value is None: + value = getattr(self.instance, self.field) + if date_value is None: + date_value = getattr(self.instance, self.date_field) + return (value, date_value) + def filter_queryset(self, attrs, queryset): raise NotImplementedError('`filter_queryset` must be implemented.') @@ -251,8 +262,7 @@ class UniqueForDateValidator(BaseUniqueForValidator): message = _('This field must be unique for the "{date_field}" date.') def filter_queryset(self, attrs, queryset): - value = attrs[self.field] - date = attrs[self.date_field] + value, date = self._get_field_values(attrs) filter_kwargs = {} filter_kwargs[self.field_name] = value @@ -266,8 +276,7 @@ class UniqueForMonthValidator(BaseUniqueForValidator): message = _('This field must be unique for the "{date_field}" month.') def filter_queryset(self, attrs, queryset): - value = attrs[self.field] - date = attrs[self.date_field] + value, date = self._get_field_values(attrs) filter_kwargs = {} filter_kwargs[self.field_name] = value @@ -279,8 +288,7 @@ class UniqueForYearValidator(BaseUniqueForValidator): message = _('This field must be unique for the "{date_field}" year.') def filter_queryset(self, attrs, queryset): - value = attrs[self.field] - date = attrs[self.date_field] + value, date = self._get_field_values(attrs) filter_kwargs = {} filter_kwargs[self.field_name] = value