Commit 853c7a16 by Ian Foote

Use setattr for adding fields to a new instance

Add test for restoring a GenericForeignKey
parent 0a0e4f22
...@@ -955,17 +955,15 @@ class ModelSerializer(Serializer): ...@@ -955,17 +955,15 @@ class ModelSerializer(Serializer):
if isinstance(self.fields.get(field_name, None), Serializer): if isinstance(self.fields.get(field_name, None), Serializer):
nested_forward_relations[field_name] = attrs[field_name] nested_forward_relations[field_name] = attrs[field_name]
# Update an existing instance... # Create an empty instance of the model
if instance is not None: if instance is None:
for key, val in attrs.items(): instance = self.opts.model()
try:
setattr(instance, key, val)
except ValueError:
self._errors[key] = self.error_messages['required']
# ...or create a new instance for key, val in attrs.items():
else: try:
instance = self.opts.model(**attrs) setattr(instance, key, val)
except ValueError:
self._errors[key] = self.error_messages['required']
# Any relations that cannot be set until we've # Any relations that cannot be set until we've
# saved the model get hidden away on these # saved the model get hidden away on these
......
...@@ -131,3 +131,21 @@ class TestGenericRelations(TestCase): ...@@ -131,3 +131,21 @@ class TestGenericRelations(TestCase):
} }
] ]
self.assertEqual(serializer.data, expected) self.assertEqual(serializer.data, expected)
def test_restore_object_generic_fk(self):
"""
Ensure an object with a generic foreign key can be restored.
"""
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
exclude = ('content_type', 'object_id')
serializer = TagSerializer()
bookmark = Bookmark(url='http://example.com')
attrs = {'tagged_item': bookmark, 'tag': 'example'}
tag = serializer.restore_object(attrs)
self.assertEqual(tag.tagged_item, bookmark)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment