From 6fdd2d9a7bfb826c4cc4d8986c6f20814b8186ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20J=C3=A4ckel?= Date: Tue, 2 Sep 2014 21:02:00 +0200 Subject: [PATCH 1/3] Add test to show that ManyToMany relation fails in Python 3 when the field attributes null==True and blank==True are set. --- tests/models.py | 4 ++++ tests/test_serializer.py | 31 ++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/tests/models.py b/tests/models.py index fe064b46a..932a7ee48 100644 --- a/tests/models.py +++ b/tests/models.py @@ -55,6 +55,10 @@ class ManyToManyModel(RESTFrameworkModel): rel = models.ManyToManyField(Anchor, help_text='Some help text.') +class ManyToManyModelTwo(RESTFrameworkModel): + rel = models.ManyToManyField(Anchor, null=True, blank=True, help_text='Some other help text.') + + class ReadOnlyManyToManyModel(RESTFrameworkModel): text = models.CharField(max_length=100, default='anchor') rel = models.ManyToManyField(Anchor) diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 90f37cf2e..31e9b8407 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -10,7 +10,7 @@ from rest_framework import serializers, fields, relations from tests.models import ( HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel, BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, - DefaultValueModel, ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, + DefaultValueModel, ManyToManyModel, ManyToManyModelTwo, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel, ForeignKeySource ) from tests.models import BasicModelSerializer @@ -757,6 +757,35 @@ class MetadataTests(TestCase): self.assertTrue(isinstance(serializer.data.fields[field_name], field)) +class ManyToManyTwoTests(TestCase): + """ + Tests model with a ManyToMany relationship with field attributes + null==True and blank==True. + """ + def setUp(self): + class ManyToManySerializer(serializers.ModelSerializer): + class Meta: + model = ManyToManyModelTwo + + self.serializer_class = ManyToManySerializer + + # An anchor instance to use for the relationship + self.anchor = Anchor() + self.anchor.save() + + def test_create(self): + """ + Create an instance of a model with a ManyToMany relationship. + """ + data = {'rel': [self.anchor.id]} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ManyToManyModelTwo.objects.all()), 2) + self.assertEqual(instance.pk, 2) + self.assertEqual(list(instance.rel.all()), [self.anchor]) + + class ManyToManyTests(TestCase): def setUp(self): class ManyToManySerializer(serializers.ModelSerializer): From e64f422d450e800ebe2fdf2c76c8091010664714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20J=C3=A4ckel?= Date: Wed, 3 Sep 2014 15:07:06 +0200 Subject: [PATCH 2/3] Fix test. --- tests/test_serializer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 31e9b8407..67d18972b 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -781,8 +781,8 @@ class ManyToManyTwoTests(TestCase): serializer = self.serializer_class(data=data) self.assertEqual(serializer.is_valid(), True) instance = serializer.save() - self.assertEqual(len(ManyToManyModelTwo.objects.all()), 2) - self.assertEqual(instance.pk, 2) + self.assertEqual(len(ManyToManyModelTwo.objects.all()), 1) + self.assertEqual(instance.pk, 1) self.assertEqual(list(instance.rel.all()), [self.anchor]) From 3fc1b132175ee98740ef31f2cb5bb826604a7e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20J=C3=A4ckel?= Date: Wed, 3 Sep 2014 16:49:36 +0200 Subject: [PATCH 3/3] Fix test. --- tests/test_serializer.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 67d18972b..fd6fe7ba1 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -763,11 +763,11 @@ class ManyToManyTwoTests(TestCase): null==True and blank==True. """ def setUp(self): - class ManyToManySerializer(serializers.ModelSerializer): + class ManyToManySerializerTwo(serializers.ModelSerializer): class Meta: model = ManyToManyModelTwo - self.serializer_class = ManyToManySerializer + self.serializer_class = ManyToManySerializerTwo # An anchor instance to use for the relationship self.anchor = Anchor() @@ -781,8 +781,7 @@ class ManyToManyTwoTests(TestCase): serializer = self.serializer_class(data=data) self.assertEqual(serializer.is_valid(), True) instance = serializer.save() - self.assertEqual(len(ManyToManyModelTwo.objects.all()), 1) - self.assertEqual(instance.pk, 1) + self.assertEqual(ManyToManyModelTwo.objects.count(), 1) self.assertEqual(list(instance.rel.all()), [self.anchor])