Skip to content

fix for #6558 default value will not be passed through validated_data #6798

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions docs/api-guide/validators.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,6 @@ If you want the date field to be visible, but not editable by the user, then set

published = serializers.DateTimeField(read_only=True, default=timezone.now)

The field will not be writable to the user, but the default value will still be passed through to the `validated_data`.

#### Using with a hidden date field.

If you want the date field to be entirely hidden from the user, then use `HiddenField`. This field type does not accept user input, but instead always returns its default value to the `validated_data` in the serializer.
Expand Down
30 changes: 29 additions & 1 deletion tests/test_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ class RelatedModel(models.Model):

class RelatedModelSerializer(serializers.ModelSerializer):
username = serializers.CharField(source='user.username',
validators=[UniqueValidator(queryset=UniquenessModel.objects.all(), lookup='iexact')]) # NOQA
validators=[UniqueValidator(queryset=UniquenessModel.objects.all(),
lookup='iexact')]) # NOQA

class Meta:
model = RelatedModel
Expand Down Expand Up @@ -65,6 +66,14 @@ class UniquenessIntegerSerializer(serializers.Serializer):
integer = serializers.CharField(validators=[UniqueValidator(queryset=IntegerFieldModel.objects.all())])


class ReadonlyDefaultDateSerializer(serializers.Serializer):
"""
This serializer is to test if read_only field
default value passed to validated data
"""
published = serializers.DateField(read_only=True, default=datetime.date.today)


class TestUniquenessValidation(TestCase):
def setUp(self):
self.instance = UniquenessModel.objects.create(username='existing')
Expand Down Expand Up @@ -245,10 +254,12 @@ def test_ignore_excluded_fields(self):
When model fields are not included in a serializer, then uniqueness
validators should not be added for that field.
"""

class ExcludedFieldSerializer(serializers.ModelSerializer):
class Meta:
model = UniquenessTogetherModel
fields = ('id', 'race_name',)

serializer = ExcludedFieldSerializer()
expected = dedent("""
ExcludedFieldSerializer():
Expand All @@ -262,6 +273,7 @@ def test_ignore_read_only_fields(self):
When serializer fields are read only, then uniqueness
validators should not be added for that field.
"""

class ReadOnlyFieldSerializer(serializers.ModelSerializer):
class Meta:
model = UniquenessTogetherModel
Expand All @@ -281,6 +293,7 @@ def test_read_only_fields_with_default(self):
"""
Special case of read_only + default DOES validate unique_together.
"""

class ReadOnlyFieldWithDefaultSerializer(serializers.ModelSerializer):
race_name = serializers.CharField(max_length=100, read_only=True, default='example')

Expand All @@ -305,6 +318,7 @@ def test_allow_explict_override(self):
"""
Ensure validators can be explicitly removed..
"""

class NoValidatorsSerializer(serializers.ModelSerializer):
class Meta:
model = UniquenessTogetherModel
Expand Down Expand Up @@ -353,6 +367,7 @@ def test_filter_queryset_do_not_skip_existing_attribute(self):
filter_queryset should add value from existing instance attribute
if it is not provided in attributes dict
"""

class MockQueryset:
def filter(self, **kwargs):
self.called_with = kwargs
Expand Down Expand Up @@ -435,6 +450,7 @@ def test_updated_instance_excluded_from_unique_for_date(self):
'published': datetime.date(2000, 1, 1)
}


# Tests for `UniqueForMonthValidator`
# ----------------------------------

Expand Down Expand Up @@ -474,6 +490,7 @@ def test_unique_for_month(self):
'published': datetime.date(2017, 2, 1)
}


# Tests for `UniqueForYearValidator`
# ----------------------------------

Expand Down Expand Up @@ -555,24 +572,35 @@ class Meta:
assert repr(serializer) == expected


class TestReadOnlyDefaultValidation(TestCase):
# converting validated data to dict from ordered dict
def test_read_only_default_donot_exists_on_validated_data(self):
serializer = ReadonlyDefaultDateSerializer(data={})
self.assertTrue(serializer.is_valid())
self.assertDictEqual(dict(serializer.validated_data), {})


class ValidatorsTests(TestCase):

def test_qs_exists_handles_type_error(self):
class TypeErrorQueryset:
def exists(self):
raise TypeError

assert qs_exists(TypeErrorQueryset()) is False

def test_qs_exists_handles_value_error(self):
class ValueErrorQueryset:
def exists(self):
raise ValueError

assert qs_exists(ValueErrorQueryset()) is False

def test_qs_exists_handles_data_error(self):
class DataErrorQueryset:
def exists(self):
raise DataError

assert qs_exists(DataErrorQueryset()) is False

def test_validator_raises_error_if_not_all_fields_are_provided(self):
Expand Down