Skip to content

Commit 53e1a2f

Browse files
author
Carlton Gibson
committed
Merge pull request #2637 from mdentremont/topic/allow-serialize-unsaved-with-relations
Support serializing unsaved models with related fields.
2 parents 0e21f1c + fb58ef0 commit 53e1a2f

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

rest_framework/relations.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,10 @@ def to_internal_value(self, data):
360360
]
361361

362362
def get_attribute(self, instance):
363+
# Can't have any relationships if not created
364+
if not instance.pk:
365+
return []
366+
363367
relationship = get_attribute(instance, self.source_attrs)
364368
return relationship.all() if (hasattr(relationship, 'all')) else relationship
365369

tests/test_relations_pk.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,16 @@ def test_many_to_many_create(self):
143143
]
144144
self.assertEqual(serializer.data, expected)
145145

146+
def test_many_to_many_unsaved(self):
147+
source = ManyToManySource(name='source-unsaved')
148+
149+
serializer = ManyToManySourceSerializer(source)
150+
151+
expected = {'id': None, 'name': 'source-unsaved', 'targets': []}
152+
# no query if source hasn't been created yet
153+
with self.assertNumQueries(0):
154+
self.assertEqual(serializer.data, expected)
155+
146156
def test_reverse_many_to_many_create(self):
147157
data = {'id': 4, 'name': 'target-4', 'sources': [1, 3]}
148158
serializer = ManyToManyTargetSerializer(data=data)
@@ -296,6 +306,16 @@ def test_foreign_key_update_with_invalid_null(self):
296306
self.assertFalse(serializer.is_valid())
297307
self.assertEqual(serializer.errors, {'target': ['This field may not be null.']})
298308

309+
def test_foreign_key_with_unsaved(self):
310+
source = ForeignKeySource(name='source-unsaved')
311+
expected = {'id': None, 'name': 'source-unsaved', 'target': None}
312+
313+
serializer = ForeignKeySourceSerializer(source)
314+
315+
# no query if source hasn't been created yet
316+
with self.assertNumQueries(0):
317+
self.assertEqual(serializer.data, expected)
318+
299319
def test_foreign_key_with_empty(self):
300320
"""
301321
Regression test for #1072

0 commit comments

Comments
 (0)