Use setattr for adding fields to a new instance

Add test for restoring a GenericForeignKey
This commit is contained in:
Ian Foote 2014-04-13 17:26:15 +01:00
parent 0a0e4f22e7
commit 853c7a16c1
2 changed files with 26 additions and 10 deletions

View File

@ -955,18 +955,16 @@ 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:
instance = self.opts.model()
for key, val in attrs.items(): for key, val in attrs.items():
try: try:
setattr(instance, key, val) setattr(instance, key, val)
except ValueError: except ValueError:
self._errors[key] = self.error_messages['required'] self._errors[key] = self.error_messages['required']
# ...or create a new instance
else:
instance = self.opts.model(**attrs)
# 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
# private attributes, so we can deal with them # private attributes, so we can deal with them

View File

@ -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)