From 5ed528d1cf9d94e410c9b5df1bfc8c231764bd57 Mon Sep 17 00:00:00 2001 From: Tomi Pajunen Date: Tue, 13 Nov 2012 15:27:25 +0200 Subject: [PATCH 1/4] Test for missing M2M data when creating an instance --- rest_framework/tests/serializer.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 059593a90..00fb689af 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -334,6 +334,15 @@ class ManyToManyTests(TestCase): self.assertEquals(instance.pk, 1) self.assertEquals(list(instance.rel.all()), []) + def test_create_relationship_missing(self): + """ + Create an instance of a model with a missing ManyToMany relationship + """ + data = {} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), False) + + def test_create_empty_relationship_flat_data(self): """ Create an instance of a model with a ManyToMany relationship, From 2408cd95e7aef408f6440a8380e8e06bba6c4960 Mon Sep 17 00:00:00 2001 From: Tomi Pajunen Date: Tue, 13 Nov 2012 15:52:58 +0200 Subject: [PATCH 2/4] Test updated --- rest_framework/tests/serializer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 00fb689af..7d750b813 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -340,7 +340,11 @@ class ManyToManyTests(TestCase): """ data = {} serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEquals(len(ManyToManyModel.objects.all()), 3) + self.assertEquals(instance.pk, 3) + self.assertEquals(list(instance.rel.all()), []) def test_create_empty_relationship_flat_data(self): From 0bd2f89b8dc497f17d5fafdf7f533c4319e8c12a Mon Sep 17 00:00:00 2001 From: Tomi Pajunen Date: Tue, 13 Nov 2012 16:16:17 +0200 Subject: [PATCH 3/4] Possible solution and test case updated --- rest_framework/fields.py | 5 ++--- rest_framework/tests/serializer.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 4c2064261..7bed4ab87 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -351,9 +351,8 @@ class ManyRelatedMixin(object): except: # Non-form data value = data.get(self.source or field_name) - else: - if value == ['']: - value = [] + if value == [''] or value is None: + value = [] into[field_name] = [self.from_native(item) for item in value] diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 7d750b813..38117b36c 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -342,11 +342,10 @@ class ManyToManyTests(TestCase): serializer = self.serializer_class(data=data) self.assertEqual(serializer.is_valid(), True) instance = serializer.save() - self.assertEquals(len(ManyToManyModel.objects.all()), 3) - self.assertEquals(instance.pk, 3) + self.assertEquals(len(ManyToManyModel.objects.all()), 2) + self.assertEquals(instance.pk, 2) self.assertEquals(list(instance.rel.all()), []) - def test_create_empty_relationship_flat_data(self): """ Create an instance of a model with a ManyToMany relationship, From 47095594dea630bcc93da9b714372d61a191e06f Mon Sep 17 00:00:00 2001 From: Tomi Pajunen Date: Wed, 14 Nov 2012 11:46:27 +0200 Subject: [PATCH 4/4] Raise ValidationError instead of accepting missing value --- rest_framework/fields.py | 9 +++++++-- rest_framework/tests/serializer.py | 6 +----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 7bed4ab87..2ad5eb7e1 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -351,8 +351,13 @@ class ManyRelatedMixin(object): except: # Non-form data value = data.get(self.source or field_name) - if value == [''] or value is None: - value = [] + else: + if value == ['']: + value = [] + + if value is None and self.required: + raise ValidationError("Field '%s' is required" % field_name) + into[field_name] = [self.from_native(item) for item in value] diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 38117b36c..e79730831 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -340,11 +340,7 @@ class ManyToManyTests(TestCase): """ data = {} serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEquals(len(ManyToManyModel.objects.all()), 2) - self.assertEquals(instance.pk, 2) - self.assertEquals(list(instance.rel.all()), []) + self.assertEqual(serializer.is_valid(), False) def test_create_empty_relationship_flat_data(self): """