This commit is contained in:
Craig de Stigter 2013-09-13 05:36:49 -07:00
commit f47391552f
3 changed files with 57 additions and 12 deletions

View File

@ -858,15 +858,19 @@ class ModelSerializer(Serializer):
if isinstance(self.fields.get(field_name, None), Serializer):
nested_forward_relations[field_name] = attrs[field_name]
if instance is None:
# Create a new instance, if we need to
field_attrs = {}
for field_name in meta.get_all_field_names():
if field_name in attrs:
field_attrs[field_name] = attrs.pop(field_name)
instance = self.opts.model(**field_attrs)
# Update an existing instance...
if instance is not None:
for key, val in attrs.items():
setattr(instance, key, val)
# ...or create a new instance
else:
instance = self.opts.model(**attrs)
# Any relations that cannot be set until we've
# saved the model get hidden away on these
# private attributes, so we can deal with them

View File

@ -81,10 +81,16 @@ class Person(RESTFrameworkModel):
@property
def info(self):
return {
if not hasattr(self, '_info'):
self._info = {
'name': self.name,
'age': self.age,
}
return self._info
@info.setter
def info(self, value):
self._info = value
class BlogPost(RESTFrameworkModel):
@ -163,6 +169,18 @@ class NullableOneToOneSource(RESTFrameworkModel):
related_name='nullable_source')
class ModelWithWritableProperty(RESTFrameworkModel):
name = models.CharField(max_length=100)
@property
def prop(self):
return getattr(self, '_value', 'hi!')
@prop.setter
def prop(self, value):
self._value = value
# Serializer used to test BasicModel
class BasicModelSerializer(serializers.ModelSerializer):
class Meta:

View File

@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers, fields, relations
from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel,
BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, DefaultValueModel,
ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel)
ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel, ModelWithWritableProperty)
from rest_framework.tests.models import BasicModelSerializer
import datetime
import pickle
@ -1643,3 +1643,26 @@ class SerializerSupportsManyRelationships(TestCase):
serializer = SimpleSlugSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]})
self.assertTrue(serializer.is_valid())
self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]})
### Regression test for #1088
class WritablePropertyModelSerializer(serializers.ModelSerializer):
prop = serializers.CharField(source='prop')
class Meta:
model = ModelWithWritableProperty
fields = ('name', 'prop',)
class ModelSerializerSupportsWritableProperty(TestCase):
def setUp(self):
ModelWithWritableProperty.objects.create(name='hey! ')
def test_modelserializer_create_with_property(self):
s = WritablePropertyModelSerializer(data={
'name': 'the name',
'prop': 'new value',
})
self.assertTrue(s.is_valid())
obj = s.save()
self.assertEqual(obj.prop, 'new value')