From 0779dcb74818f3b952371a3819c6daa335836c8e Mon Sep 17 00:00:00 2001 From: khamaileon Date: Mon, 16 Jun 2014 14:24:12 +0200 Subject: [PATCH 1/2] Fix #1643 issue: empty values in reverse nested OneToMany are not validated by the serializer --- rest_framework/serializers.py | 2 +- rest_framework/tests/test_relations_nested.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index c2b414d7a..92ecf114d 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -446,7 +446,7 @@ class BaseSerializer(WritableField): if not self._errors: into.update(reverted_data) else: - if value in (None, ''): + if value in (None, '') and not self.many: into[(self.source or field_name)] = None else: # Set the serializer object if it exists diff --git a/rest_framework/tests/test_relations_nested.py b/rest_framework/tests/test_relations_nested.py index 4d9da4896..cf5227af1 100644 --- a/rest_framework/tests/test_relations_nested.py +++ b/rest_framework/tests/test_relations_nested.py @@ -283,6 +283,13 @@ class ReverseNestedOneToManyTests(TestCase): self.assertFalse(serializer.is_valid()) self.assertEqual(serializer.errors, {'sources': [{}, {}, {}, {'name': ['This field is required.']}]}) + def test_one_to_many_create_with_empty_string(self): + data = {'id': 1, 'name': 'target-1', 'sources': ''} + instance = OneToManyTarget.objects.get(pk=1) + serializer = self.Serializer(instance, data=data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'sources': [{u'non_field_errors': [u'Expected a list of items.']}]}) + def test_one_to_many_update(self): data = {'id': 1, 'name': 'target-1-updated', 'sources': [{'id': 1, 'name': 'source-1-updated'}, {'id': 2, 'name': 'source-2'}, From 4ee91643367af91c861d3fd6764ac9293d7d5ab3 Mon Sep 17 00:00:00 2001 From: khamaileon Date: Mon, 16 Jun 2014 14:45:24 +0200 Subject: [PATCH 2/2] Make string python 3 compliant --- rest_framework/tests/test_relations_nested.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/tests/test_relations_nested.py b/rest_framework/tests/test_relations_nested.py index cf5227af1..ccc4b96a3 100644 --- a/rest_framework/tests/test_relations_nested.py +++ b/rest_framework/tests/test_relations_nested.py @@ -288,7 +288,7 @@ class ReverseNestedOneToManyTests(TestCase): instance = OneToManyTarget.objects.get(pk=1) serializer = self.Serializer(instance, data=data) self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'sources': [{u'non_field_errors': [u'Expected a list of items.']}]}) + self.assertEqual(serializer.errors, {'sources': [{'non_field_errors': ['Expected a list of items.']}]}) def test_one_to_many_update(self): data = {'id': 1, 'name': 'target-1-updated', 'sources': [{'id': 1, 'name': 'source-1-updated'},