Allow UniqueForXValidators to use instance data

This commit is contained in:
Andrew Pinkham 2018-12-22 16:56:57 +01:00
parent 40a184c544
commit 8547dbcbc5
No known key found for this signature in database
GPG Key ID: FACEF94E02416ACA

View File

@ -215,6 +215,17 @@ class BaseUniqueForValidator(object):
if missing_items: if missing_items:
raise ValidationError(missing_items, code='required') 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): def filter_queryset(self, attrs, queryset):
raise NotImplementedError('`filter_queryset` must be implemented.') 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.') message = _('This field must be unique for the "{date_field}" date.')
def filter_queryset(self, attrs, queryset): def filter_queryset(self, attrs, queryset):
value = attrs[self.field] value, date = self._get_field_values(attrs)
date = attrs[self.date_field]
filter_kwargs = {} filter_kwargs = {}
filter_kwargs[self.field_name] = value filter_kwargs[self.field_name] = value
@ -266,8 +276,7 @@ class UniqueForMonthValidator(BaseUniqueForValidator):
message = _('This field must be unique for the "{date_field}" month.') message = _('This field must be unique for the "{date_field}" month.')
def filter_queryset(self, attrs, queryset): def filter_queryset(self, attrs, queryset):
value = attrs[self.field] value, date = self._get_field_values(attrs)
date = attrs[self.date_field]
filter_kwargs = {} filter_kwargs = {}
filter_kwargs[self.field_name] = value filter_kwargs[self.field_name] = value
@ -279,8 +288,7 @@ class UniqueForYearValidator(BaseUniqueForValidator):
message = _('This field must be unique for the "{date_field}" year.') message = _('This field must be unique for the "{date_field}" year.')
def filter_queryset(self, attrs, queryset): def filter_queryset(self, attrs, queryset):
value = attrs[self.field] value, date = self._get_field_values(attrs)
date = attrs[self.date_field]
filter_kwargs = {} filter_kwargs = {}
filter_kwargs[self.field_name] = value filter_kwargs[self.field_name] = value