aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlton Gibson2015-03-08 20:22:49 +0100
committerCarlton Gibson2015-03-08 20:22:49 +0100
commit53e1a2fcb9643a4a1ea07881ea207e9bbefdf5df (patch)
tree3f642c80e3df19f3a70a01c3501a3a0f74e176c0
parent0e21f1c4f4cd91551cd6021a8ca03a6911feac44 (diff)
parentfb58ef043cc39d900bb8389855f07087cb0d7920 (diff)
downloaddjango-rest-framework-53e1a2fcb9643a4a1ea07881ea207e9bbefdf5df.tar.bz2
Merge pull request #2637 from mdentremont/topic/allow-serialize-unsaved-with-relations
Support serializing unsaved models with related fields.
-rw-r--r--rest_framework/relations.py4
-rw-r--r--tests/test_relations_pk.py20
2 files changed, 24 insertions, 0 deletions
diff --git a/rest_framework/relations.py b/rest_framework/relations.py
index 0b7c9d86..3a966c5b 100644
--- a/rest_framework/relations.py
+++ b/rest_framework/relations.py
@@ -360,6 +360,10 @@ class ManyRelatedField(Field):
]
def get_attribute(self, instance):
+ # Can't have any relationships if not created
+ if not instance.pk:
+ return []
+
relationship = get_attribute(instance, self.source_attrs)
return relationship.all() if (hasattr(relationship, 'all')) else relationship
diff --git a/tests/test_relations_pk.py b/tests/test_relations_pk.py
index f872a8dc..ca43272b 100644
--- a/tests/test_relations_pk.py
+++ b/tests/test_relations_pk.py
@@ -143,6 +143,16 @@ class PKManyToManyTests(TestCase):
]
self.assertEqual(serializer.data, expected)
+ def test_many_to_many_unsaved(self):
+ source = ManyToManySource(name='source-unsaved')
+
+ serializer = ManyToManySourceSerializer(source)
+
+ expected = {'id': None, 'name': 'source-unsaved', 'targets': []}
+ # no query if source hasn't been created yet
+ with self.assertNumQueries(0):
+ self.assertEqual(serializer.data, expected)
+
def test_reverse_many_to_many_create(self):
data = {'id': 4, 'name': 'target-4', 'sources': [1, 3]}
serializer = ManyToManyTargetSerializer(data=data)
@@ -296,6 +306,16 @@ class PKForeignKeyTests(TestCase):
self.assertFalse(serializer.is_valid())
self.assertEqual(serializer.errors, {'target': ['This field may not be null.']})
+ def test_foreign_key_with_unsaved(self):
+ source = ForeignKeySource(name='source-unsaved')
+ expected = {'id': None, 'name': 'source-unsaved', 'target': None}
+
+ serializer = ForeignKeySourceSerializer(source)
+
+ # no query if source hasn't been created yet
+ with self.assertNumQueries(0):
+ self.assertEqual(serializer.data, expected)
+
def test_foreign_key_with_empty(self):
"""
Regression test for #1072